【发布时间】:2014-09-13 20:13:50
【问题描述】:
我正在测试推回对象与推回对象指针到 C++ 中的向量之间的性能差异。
我在 Stackoverflow 和其他文章中读到,除非你必须这样做,否则你应该避免推回指针......
但是,我意识到推回指针会带来巨大的性能提升,,,
这是我运行的一个简单测试:
tstart = chrono::system_clock::now();
vector<MyObject> VectorOfObjects;
for (int i=0; i<10000; i++) {
MyObject x("test");
VectorOfObjects.push_back(x);
}
tend = chrono::system_clock::now();
tt = tend-tstart;
cout << "Pushback Object: " << tt.count()*1000 << " Milliseconds\n" << endl;
tstart = chrono::system_clock::now();
vector<MyObject *> VectorOfPointers;
for (int i=0; i<10000; i++) {
VectorOfPointers.push_back(new MyObject("test"));
}
tend = chrono::system_clock::now();
tt = tend-tstart;
cout << "Pushback Pointers: " << tt.count()*1000 << " Milliseconds\n" << endl;
结果实际上非常令人惊讶:
Pushback Objects: 989 Milliseconds
Pushback Pointers: 280 Milliseconds
如您所见,推回指针比推回对象快 3~4 倍!这是一个巨大的性能差异,尤其是在处理大量数据时。
所以我的问题是:为什么不使用指针向量??
Stackoverflow 上几乎所有关于类似问题的帖子的答案都是避免使用指针向量。
我知道内存泄漏可能是个问题,但我们总是可以使用智能指针,甚至在销毁时手动删除指针也不是那么困难..
我也很好奇造成这种性能差异的原因..
谢谢
更新:
实际上我在ideone .... 上进行了测试,在这里,推回对象更快!!!
在 Visual Studio 中,推回 Objects 会更慢..
这是为什么……??
【问题讨论】:
-
如果您需要指针向量,请使用 Boost ptr 容器。 C++11 的移动语义应该很好地涵盖对象的副本。如果您要向我们提供性能示例,请实际使用完整的示例和编译器选项。
-
通常情况下,容器中的对象(以及一般的对象)的访问频率远高于创建它们的频率。您是否尝试过衡量其成本?
-
你是如何构建这个的?编译器应该已经优化了第一个循环。
-
@juanchopanza 抱歉,“运行循环没有影响”??它正在改变向量的状态。它也不应该完全删除代码。不知道你的意思是什么
-
我是认真的。最重要的是,对
new的 10000 次调用非常昂贵。对象向量只分配少量内存,您可以通过在填充之前调用VectorOfObjects.reserve(10000)将其减少到两个。最重要的是,对象数据的向量将是连续的,而指针是分散的。访问前者会更快。