При попытке оценить разницу в производительности между push_back
и std::inserter
я столкнулся с очень странной проблемой производительности.
Рассмотрим следующий код:
#include <vector>
using container = std::vector<int>;
const int size = 1000000;
const int count = 1000;
#ifdef MYOWNFLAG
void foo(std::insert_iterator<container> ist)
{
for(int i=0; i<size; ++i)
*ist++ = i;
}
#endif
void bar(container& cnt)
{
for(int i=0; i<size; ++i)
cnt.push_back(i);
}
int main()
{
container cnt;
for (int i=0; i<count; ++i)
{
cnt.clear();
bar(cnt);
}
return 0;
}
В этом случае не определено, определено или нет MYOWNFLAG
, функция foo не вызывается. Однако значение этого флага влияет на производительность:
$ g++ -g -pipe -march=native -pedantic -std=c++11 -W -Wall -Wextra -Werror -O3 -o bin/inserter src/inserter.cc && time ./bin/inserter
./bin/inserter 4,73s user 0,00s system 100% cpu 4,728 total
$ g++ -g -pipe -march=native -pedantic -std=c++11 -W -Wall -Wextra -Werror -O3 -o bin/inserter src/inserter.cc -DMYOWNFLAG && time ./bin/inserter
./bin/inserter 2,09s user 0,00s system 99% cpu 2,094 total
Обратите внимание, что если я изменяю прототип foo
для использования std::back_insert_iterator
, я получаю аналогичную производительность, как если бы я не устанавливал флаг.
Что происходит с оптимизацией компилятора???
ИЗМЕНИТЬ
Я использую gcc 4.9.2 20150304 (preerelease)
Repoduced
- воспроизведенный stefan на ideone
- воспроизведенный мной на другой машине с gcc 4.9.2
- не воспроизводится мной на другой машине с gcc 4.6.3 и флаг -std = С++ 0x