【发布时间】:2011-03-07 06:31:33
【问题描述】:
有什么方法可以让std::vector 在reserving + resizing 上更快?
我希望获得与普通 C 数组相当的性能。
查看以下代码sn-ps:
TEST(test, vector1) {
for (int i = 0; i < 50; ++i) {
std::vector<int> a;
a.reserve(10000000);
a.resize(10000000);
}
}
TEST(test, vector2) {
for (int i = 0; i < 50; ++i) {
std::vector<int> a(10000000);
}
}
TEST(test, carray) {
for (int i = 0; i < 50; ++i) {
int* new_a = new int[10000000];
delete[] new_a;
}
}
前两个测试要慢两倍(4095 ms vs 2101 ms),很明显,这是因为std::vector 将其中的元素归零。 关于如何避免这种情况的任何想法?
或者可能有一些标准的 (boost?) 容器实现了一个固定大小和基于堆的数组?
谢谢
【问题讨论】:
-
为了让测试做同样的工作,
carray测试需要一个for(std::size_t idx=0; idx<10000000; ++idx) new_a[idx]=0;。一旦进入,我怀疑你会发现重大变化。 -
我建议使用分析器,并且仅在性能低的情况下进行优化。上述代码可能不会出现在普通应用程序中。你通常不会做这样的事情。可能最好的方法是创建自己的数组类以获得更多控制权。
-
@Iulian:这是我希望能够对 cmets 投反对票的 cmets 之一。你到底为什么要创建自己的数组?你真的尝试过实现
std::vector吗?你会发现,想出一个既正确又快速的veryion是非常困难的。 -
@sbi 这样的“基准”在我看来是无关紧要的。这就是为什么必须在实际应用程序上进行测试而不是进行此类基准测试的原因——它可能会导致性能是 OK 事件与“慢”std::vector。如果他在这些地方发现性能问题,那么他可以考虑重写 std::vector 中使用的部分以减少 CPU 周期的浪费。此外,我相信上面的代码不太可能存在于 真实 应用程序中。我的原则是先让它发挥作用,然后让它更好/更快。
-
@lulian:这是一个很好的原则。但是@sbi 在这里完全符合要求。 stl 是一个经过深思熟虑、精心设计的库(如果使用得当),它的性能几乎与它们令人讨厌的 C 对应物一样好。创建您自己的数组类将导致花费在调试上的时间比在代码库的整个生命周期中可能节省的时间更多。
标签: c++ performance arrays vector