これはすでにWhy C++ lambda is slower than ordinary function when called multiple times?とC++0x Lambda overhead で触れられていましたが、私の例は前者の議論とは少し異なり、後者の結果と矛盾していると思います。私のコードのボトルネックのための検索でC++でラムダ関数のオーバーヘッドを理解する11
私はバッファに値をコピーするように、与えられたプロセッサ機能付き可変長引数リストを処理recusiveテンプレート関数を発見しました。コンパイル
int buffer[10];
int main(int argc, char **argv)
{
int *p = buffer;
for (unsigned long int i = 0; i < 10E6; ++i)
{
p = buffer;
ProcessArguments<int>([&p](const int &v) { *p++ = v; }, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
}
}
:
template <typename T>
void ProcessArguments(std::function<void(const T &)> process)
{}
template <typename T, typename HEAD, typename ... TAIL>
void ProcessArguments(std::function<void(const T &)> process, const HEAD &head, const TAIL &... tail)
{
process(head);
ProcessArguments(process, tail...);
}
私はラムダ関数と同様に移動ポインタを使用してグローバルバッファにコピー引数をグローバル関数と一緒に、このコードを使用するプログラムの実行時間を比較しましたg ++ 4.6の場合、ツール時間の測定はマシンで6秒以上かかりますが、
int buffer[10];
int *p = buffer;
void CopyIntoBuffer(const int &value)
{
*p++ = value;
}
int main(int argc, char **argv)
{
int *p = buffer;
for (unsigned long int i = 0; i < 10E6; ++i)
{
p = buffer;
ProcessArguments<int>(CopyIntoBuffer, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
}
return 0;
}
の場合は約1.4秒かかります。
私は時間のオーバーヘッドを説明し、私は、実行時に支払うことなく、ラムダ関数を利用するために何かを変更することができるかどうか疑問に思って舞台裏で何が起こっているかを得ることはありません。
だから、グローバルなものがあり、本当に遅く:、予想通り、ラムダ本体をインライン化 注意はあなたに最高のパフォーマンスを与えていますか?ラムダベースでは6対1.4ですが、最後の文は意味がありません。 – dasblinkenlight
分析を行っているときに、生成されたアセンブリリストを調べましたか? – WhozCraig
void processArguments(const std :: function&process) 'のように' process'参照を 'const'参照で渡すでしょうか? –
dasblinkenlight