有没有办法让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?) 容器实现了固定大小和基于堆的数组?
5条答案
按热度按时间tez616oj1#
当然,前两个测试比较慢。它们显式地遍历整个向量,并在每个元素上调用“int()”。编辑:这会将所有元素设置为“0”。
试着保留。
有一些非常相关的信息,你的问题在这个问题我问了一会儿回来:
std::vector reserve() and push_back() is faster than resize() and array index, why?
ql3eal8s2#
有boost::array。
h9vpoimq3#
你的测试是在调试模式还是发布模式下进行的?我知道微软的编译器增加了很多调试检查,这确实会降低性能。
mwg9r5ms4#
也许你可以使用boost::scoped_array,但是如果这真的是性能关键,也许你应该尝试将初始化/分配放在最里面的循环之外?
xtupzzrd5#
我将给予你怀疑的好处,并假设你已经做了一些分析,并确定以这种方式使用vector是一个热点。如果没有,考虑这些差异有点为时过早,除非你正在一个非常紧凑的小规模应用程序中工作,每个时钟周期都很重要,在这种情况下,使用分析器更容易,而且也有同样多的理由这样做。
boost::scoped_array是一种解决方案。没有办法让vector不初始化它存储的元素。另一种方法是std::deque,如果你不需要连续的内存块。deque可以比vector或动态分配的数组快得多,因为它创建的元素数量相同,因为它创建的内存块更小,操作系统倾向于更好地处理沿着缓存友好。