これは、複数回呼び出されたときに C++ ラムダが通常の関数よりも遅いのはなぜですか?で既に触れました。およびC++0x ラムダのオーバーヘッド しかし、私の例は前者の議論とは少し異なり、後者の結果と矛盾していると思います。
コードのボトルネックを探していると、値をバッファにコピーするなど、特定のプロセッサ関数で可変引数リストを処理する再帰的なテンプレート関数を見つけました。
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...);
}
このコードをラムダ関数と一緒に使用するプログラムと、移動ポインターを使用してグローバル バッファーに引数をコピーするグローバル関数の実行時間を比較しました。
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);
}
}
g++ 4.6 および -O3 でコンパイルされたツールの時間は、マシンで 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秒かかります。
時間のオーバーヘッドを説明する舞台裏で何が起こっているのかわかりません。実行時に支払うことなくラムダ関数を利用するために何かを変更できるかどうか疑問に思っています。