I thought that emplace_back
would be the winner, when doing something like this:
v.push_back(myClass(arg1, arg2));
because emplace_back
would construct the object immediately in the vector, while push_back
, would first construct an anonymous object and then would copy it to the vector. For more see this question.
Google also gives this and this questions.
I decided to compare them for a vector that would be filled by integers.
Here is the experiment code:
#include <iostream>
#include <vector>
#include <ctime>
#include <ratio>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main() {
vector<int> v1;
const size_t N = 100000000;
high_resolution_clock::time_point t1 = high_resolution_clock::now();
for(size_t i = 0; i < N; ++i)
v1.push_back(i);
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "push_back took me " << time_span.count() << " seconds.";
std::cout << std::endl;
vector<int> v2;
t1 = high_resolution_clock::now();
for(size_t i = 0; i < N; ++i)
v2.emplace_back(i);
t2 = high_resolution_clock::now();
time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "emplace_back took me " << time_span.count() << " seconds.";
std::cout << std::endl;
return 0;
}
The result is that emplace_back
is faster.
push_back took me 2.76127 seconds.
emplace_back took me 1.99151 seconds.
Why? The answer of the 1st linked question clearly says that there will be no performance difference.
Also tried with other time methods, but got identical results.
[EDIT]
Comments say that testing with int
s doesn't say anything and that push_back
takes a ref.
I did the same test in the code above, but instead of int
I had a class A
:
class A {
public:
A(int a) : a(a) {}
private:
int a;
};
Result:
push_back took me 6.92313 seconds.
emplace_back took me 6.1815 seconds.
[EDIT.2]
As denlan said, I should also change the position of the operations, so I swapped them and in both situation (int
and class A
), emplace_back
was again the winner.
[SOLUTION]
I was running the code in debug mode
, which makes the measurements invalid. For benchmarking, always run the code in release mode
.
emplace_back
would be faster – certainly not slower. What I don't understand (and can't find anywhere) is why even in this simplest case you have, why the optimizer doesn't produce the same code. Any ideas? – Ben