Это уже коснулось Почему С++ лямбда медленнее обычной функции при вызове несколько раз? и С++ 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 секунды.
Я не понимаю, что происходит за кулисами, объясняющее время накладных расходов, и мне интересно, могу ли я что-то изменить, чтобы использовать лямбда-функции, не оплачивая время выполнения.