Let's consider the following code
#include <vector>
using container = std::vector<int>;
const int size = 1000000;
const int count = 1000;
void foo(std::insert_iterator<container> ist)
{
for(int i=0; i<size; ++i)
*ist++ = i;
}
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();
#ifdef FOO
foo(std::inserter(cnt, cnt.begin())); // using cnt.end() gives similar results
#else
bar(cnt);
#endif
}
return 0;
}
I get huge performance variations
Using Foo:
$ g++ -g -pipe -march=native -pedantic -std=c++11 -W -Wall -Wextra -Werror -O3 -o bin/inserter src/inserter.cc -DFOO
$ time ./bin/inserter
./bin/inserter 4,96s user 0,01s system 100% cpu 4,961 total
Using Bar:
$ 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 2,08s user 0,01s system 99% cpu 2,092 total
Can someone explain why there are so much performance variation and why would someone want to use std::inserter
?