C ++ - STL矢量问题

时间:2010-06-23 11:01:42

标签: c++ performance arrays vector

有没有办法让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 个答案:

答案 0 :(得分:11)

自然,前两个测试速度较慢。它们显式遍历整个向量并在每个元素上调用“int()”。编辑:这具有将所有元素设置为“0”的效果。

试试预约。

在我回答这个问题时,你的问题有一些非常相关的信息:

std::vector reserve() and push_back() is faster than resize() and array index, why?

答案 1 :(得分:2)

boost::array

答案 2 :(得分:2)

您的测试是在调试模式还是发布模式下执行的?我知道微软编译器增加了许多可以真正降低性能的调试检查。

答案 3 :(得分:1)

也许你可以使用boost::scoped_array,但如果这对性能至关重要,也许你应该尝试以某种方式将初始化/分配放在最内层循环之外?

答案 4 :(得分:1)

我将给你怀疑的好处,并假设你已经做了一些分析,并确定以这种方式使用矢量成为一个热点。如果没有,那么考虑差异还为时过早,除非你在一个非常紧凑的小规模应用中工作,每个时钟周期都很重要,在这种情况下使用分析器会更容易,并且有很多理由要做如此。

boost :: scoped_array是一个解决方案。没有办法让vector无法初始化它存储的元素。如果你不需要连续的内存块,另一个是std :: deque。 deque可以比vector或动态分配的数组快得多,它们创建的元素数量相同,因为它会创建更小的内存块,操作系统往往更好地处理,并且对缓存友好。