Я тестирую следующий код:
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
int main(int argc, char* argv[])
{
std::vector<int> v(10000000);
clock_t then = clock();
if(argc <= 1)
std::for_each(v.begin(), v.end(), [](int& it){ it = 10098; });
else
for(auto it = v.begin(); it != v.end(); ++it) *it = 98775;
std::cout << clock() - then << "\n";
return 0;
}
Я компилирую его с помощью g ++ 4.6, без каких-либо флагов оптимизации, и вот что я получаю:
[javadyan@myhost experiments]$ ./a.out
260000
[javadyan@myhost experiments]$ ./a.out aaa
330000
[javadyan@myhost experiments]$
ИспользованиеОптимизация -O1 дает следующие (неудивительные) результаты:
[javadyan@myhost experiments]$ ./a.out
20000
[javadyan@myhost experiments]$ ./a.out aaa
20000
Я использую Linux 3.0 на двухъядерном ноутбуке с частотой 2 ГГц, если это имеет значение.
Что мне интересно, так это какпрограмма, скомпилированная без какой-либо оптимизации, вызов for_each с лямбда-функцией может потреблять меньше часов, чем обычный цикл for?Не должно ли быть даже незначительных накладных расходов при вызове анонимной функции?Есть ли документация о том, как g ++ обрабатывает подобный код
std::for_each(v.begin(), v.end(), [](int& it){ it = 10098; });
?Каково поведение других популярных компиляторов в этом случае?
ОБНОВЛЕНИЕ
Я не учел тот факт, что it
во втором выражении сравнивается с v.end()
на каждую итерацию.После исправления цикл for потребляет меньше часов, чем for_each.Однако мне все еще интересно, как компилятор оптимизирует for_each при использовании флага -O1.