【发布时间】:2015-06-09 15:04:46
【问题描述】:
我一直在运行一个用于科学目的的 c++ 程序,现在我正在考虑对其进行优化。
瓶颈似乎是我需要堆叠整数对的函数。他们的数量从一开始就不可能知道,我一直在使用一个自定义结构的std::vector,其中包含两个ints。是否有更有效的数据容器可以在末尾重复添加元素?我应该将它与两个 ints 一起使用,而不是一对或自定义结构吗?
编辑:
在对我的程序进行计时和分析之后,我可以说,就我的使用而言,vector 比deque 稍快(仅快 3%)。我的外行结论是 CPU 很好地利用了数据的连续性。优化对我来说比以往任何时候都更神奇!对于那些可能会有所帮助的人:实际上,通过从 STL C++ 11 随机数生成器切换到 BOOST 生成器,我显着提高了运行时间。
【问题讨论】:
-
您需要如何访问数据?您需要从前面、后面还是中间访问它?此信息对于确定要使用的容器很重要。
-
std::pair<int, int>用于保存一对整数。您不需要制作自己的结构来保存它。至于选择快速附加的数据结构,这方面有很多内容。但最终,理论上快速的(例如链表)可能会被现代 CPU 缓存策略破坏,因此您可能必须尝试各种容器和基准测试,直到获得满意的解决方案。 -
std::vector<std::pair<int, int>>很好,尝试在已知资源估计的情况下策略性地使用reserve,并避免破坏和重建向量。 -
@bastien 不一定。
std::list将导致每个节点的动态内存分配,并且您的数据可能分散在您的内存中。std::vector在向量末尾有一个摊销的 O(1) 插入,当按顺序访问元素时,您将拥有更好的内存局部性。 (CPU 喜欢按顺序访问内存……)
标签: c++ vector containers