如何最好地快速填充向量?

时间:2011-06-11 18:48:17

标签: c++ optimization vector

我有一些我正在研究的模拟代码,就优化而言,我刚刚摆脱了所有悬而未决的成果。代码现在花费一半时间推回向量。 (最终载体​​的大小是已知的,我保留适当的)

基本上我将一个向量重新排列为另一个向量的排列,或用随机元素填充向量。

有没有更快的方法推回到矢量?或推回/复制多个元素?

std::vector<unsigned int, std::allocator<unsigned int> >::push_back(unsigned int const&)

提前致谢。

编辑:额外信息;我正在使用-O3运行发布版本,还需要保留原始向量。

5 个答案:

答案 0 :(得分:4)

你可以看看

  • c ++ 0x(在the concept of move semantics
  • 中可以在此区域进行大量优化
  • EASTL(性能优越,主要通过使用自定义分配器(_您可以在大约一小时内启动并运行),唯一可见的更改将是{{ 1}} - &gt; std::vector和一些额外的链接对象。)
  • 你可以放入google perftools tcmalloc(虽然显然你已经通过预先分配进行了优化,但这并不重要)。

如果真正的矢量处理是瓶颈,我个人不会期望获得太大的收获。我真的想看(按优先顺序)并行化:

  • GNU openmp(eastl::vector
  • 只是openmp和'manual'CPPFLAGS+=-D_GLIBCXX_PARALLEL -fopenmp
  • 英特尔TBB(最适合使用英特尔编译器)

我一定是忘了什么。是的,请看这里:http://www.agner.org/optimize/

编辑:我总是忘记最简单的事情:使用memcpy / memmove将POD元素大量附加到预先分配的矢量。

答案 1 :(得分:3)

如果您预先预留空间,那么您的矢量与数组一样快。你不能在数学上使它更快;不要担心,继续做别的事情!

如果您运行的是“调试版本”,即可能正在经历速度减慢,即标准库实现已关闭优化,并且调试跟踪信息已打开。

答案 2 :(得分:2)

push_back上的

int非常有效。所以我会在其他地方寻找优化机会。

Nemo的第一个微优化规则:数学很快;记忆很慢。创建一个巨大的向量对缓存不友好。

例如,您可以根据需要计算需要的元素,然后直接从原始向量访问该元素,而不是创建原始向量的排列吗?

同样,你真的需要一个随机整数向量吗?为什么不在需要时生成随机数 ? (如果你以后必须记住它,那么继续把它推到矢量上然后......但不是之前。)

push_back上{p} int的速度和它的速度一样快。我敢打赌,即使你摆脱了reserve,也几乎没有注意到差异(因为重新分配不经常发生,并且将使用非常快的批量拷贝)。因此,您需要采取更广泛的视角来提高绩效。

答案 3 :(得分:1)

如果您有多个向量,则可以通过使用自定义分配器连续分配它们来提高速度。改善内存局部性可以很好地改善算法的运行时间。

答案 4 :(得分:-3)

如果您使用的是STL的Debug版本,则在所有STL调用中都会有调试开销(特别是在迭代器中)。

我建议用常规数组替换STL向量。如果您使用的是可复制的类型,则可以使用memcpy调用轻松复制多个元素。