c++ 有没有一种方法可以避免在调整大小时将矢量元素归零,以提高性能?

ia2d9nvy  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(119)

有没有办法让std::vectorreserving + 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?) 容器实现了固定大小和基于堆的数组?

tez616oj

tez616oj1#

当然,前两个测试比较慢。它们显式地遍历整个向量,并在每个元素上调用“int()”。编辑:这会将所有元素设置为“0”。
试着保留。
有一些非常相关的信息,你的问题在这个问题我问了一会儿回来:
std::vector reserve() and push_back() is faster than resize() and array index, why?

h9vpoimq

h9vpoimq3#

你的测试是在调试模式还是发布模式下进行的?我知道微软的编译器增加了很多调试检查,这确实会降低性能。

mwg9r5ms

mwg9r5ms4#

也许你可以使用boost::scoped_array,但是如果这真的是性能关键,也许你应该尝试将初始化/分配放在最里面的循环之外?

xtupzzrd

xtupzzrd5#

我将给予你怀疑的好处,并假设你已经做了一些分析,并确定以这种方式使用vector是一个热点。如果没有,考虑这些差异有点为时过早,除非你正在一个非常紧凑的小规模应用程序中工作,每个时钟周期都很重要,在这种情况下,使用分析器更容易,而且也有同样多的理由这样做。
boost::scoped_array是一种解决方案。没有办法让vector不初始化它存储的元素。另一种方法是std::deque,如果你不需要连续的内存块。deque可以比vector或动态分配的数组快得多,因为它创建的元素数量相同,因为它创建的内存块更小,操作系统倾向于更好地处理沿着缓存友好。

相关问题