有没有办法让std::vector
上的reserving + resizing
更快?
我希望实现与普通C数组相当的性能。
请参阅以下代码段:
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?)容器实现了固定大小和基于堆的数组?
谢谢
答案 0 :(得分:11)
自然,前两个测试速度较慢。它们显式遍历整个向量并在每个元素上调用“int()”。编辑:这具有将所有元素设置为“0”的效果。
试试预约。
在我回答这个问题时,你的问题有一些非常相关的信息:
std::vector reserve() and push_back() is faster than resize() and array index, why?
答案 1 :(得分:2)
答案 2 :(得分:2)
您的测试是在调试模式还是发布模式下执行的?我知道微软编译器增加了许多可以真正降低性能的调试检查。
答案 3 :(得分:1)
也许你可以使用boost::scoped_array,但如果这对性能至关重要,也许你应该尝试以某种方式将初始化/分配放在最内层循环之外?
答案 4 :(得分:1)
我将给你怀疑的好处,并假设你已经做了一些分析,并确定以这种方式使用矢量成为一个热点。如果没有,那么考虑差异还为时过早,除非你在一个非常紧凑的小规模应用中工作,每个时钟周期都很重要,在这种情况下使用分析器会更容易,并且有很多理由要做如此。
boost :: scoped_array是一个解决方案。没有办法让vector无法初始化它存储的元素。如果你不需要连续的内存块,另一个是std :: deque。 deque可以比vector或动态分配的数组快得多,它们创建的元素数量相同,因为它会创建更小的内存块,操作系统往往更好地处理,并且对缓存友好。