为了提高性能,有没有办法避免在调整大小时将向量元素归零?

问题描述 投票:0回答:5

有什么办法可以让

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
正在将其中的元素清空。 有什么办法可以避免这种情况吗?

或者可能有一些标准的(提升?)容器实现了固定大小和基于堆的数组?

c++ arrays performance stdvector
5个回答
11
投票

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

请尝试预订。

我不久前问过这个问题,其中有一些与您的问题非常相关的信息:

std::vector Reserve() 和 Push_back() 比 resize() 和数组索引更快,为什么?


2
投票

boost::array


2
投票

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


1
投票

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


1
投票

我将给您带来怀疑,并假设您已经完成了一些分析并确定以这种方式使用矢量是一个热点。如果不是,那么考虑这些差异还为时过早,除非您正在一个非常紧凑的小型应用程序中工作,其中每个时钟周期都很重要,在这种情况下,使用分析器会更容易,并且有同样多的理由这样做所以。

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

© www.soinside.com 2019 - 2024. All rights reserved.