当我这样做时,我认为emplace_back
应该是最佳选择:
v.push_back(myClass(arg1, arg2));
因为emplace_back
会立即在向量中构造对象,而push_back
会先构造一个匿名对象,然后将其复制到向量中。更多信息请参见此问题。
我决定比较它们用于填充整数的向量。
下面是实验代码:
#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;
}
结果是emplace_back
更快。
push_back took me 2.76127 seconds.
emplace_back took me 1.99151 seconds.
为什么?第一个链接问题的答案清楚地表明不会有性能差异。
我还尝试了其他时间方法,但结果相同。
[编辑]
评论说,测试int
并没有什么意义,并且push_back
需要引用。
我在上面的代码中进行了相同的测试,但是我使用了类A
而不是int
:
class A {
public:
A(int a) : a(a) {}
private:
int a;
};
结果:
push_back took me 6.92313 seconds.
emplace_back took me 6.1815 seconds.
[编辑.2]
正如denlan所说,我也应该改变操作的顺序,所以我交换了它们的位置,在两种情况下(int
和class A
),emplace_back
再次获胜。
[解决方案]
我是在debug模式
下运行代码,这使得测量结果无效。进行基准测试时,始终以release模式
运行代码。
emplace_back
会更快 - 肯定不会更慢。但我不明白(也找不到任何地方)为什么即使在这种最简单的情况下,优化器也不能生成相同的代码。有什么想法吗? - Ben