我有一些我正在研究的模拟代码,就优化而言,我刚刚摆脱了所有悬而未决的成果。代码现在花费一半时间推回向量。 (最终载体的大小是已知的,我保留适当的)
基本上我将一个向量重新排列为另一个向量的排列,或用随机元素填充向量。
有没有更快的方法推回到矢量?或推回/复制多个元素?
std::vector<unsigned int, std::allocator<unsigned int> >::push_back(unsigned int const&)
提前致谢。
编辑:额外信息;我正在使用-O3运行发布版本,还需要保留原始向量。
答案 0 :(得分:4)
你可以看看
move semantics
)std::vector
和一些额外的链接对象。)如果真正的矢量处理是瓶颈,我个人不会期望获得太大的收获。我真的想看(按优先顺序)并行化:
eastl::vector
)CPPFLAGS+=-D_GLIBCXX_PARALLEL -fopenmp
我一定是忘了什么。是的,请看这里: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
调用轻松复制多个元素。