繁体   English   中英

哪个最快? boost :: multi_array还是std :: vector?

[英]Which is the fastest? A boost::multi_array or a std::vector?

哪个最快? 一个boost::multi_arraystd::vector 我将以3维存储(不是恒定的)17.179.869元素,这些元素需要非常快速且经常地在for循环内进行访问。 表现最好的是什么? 一个std::vectorboost::multi_array

(我不希望它能在一秒钟内完成,但我想使其尽可能高效,因为纳秒级的差异可以节省大量时间。)

最好的建议是自己进行基准测试。

无论如何,由于您似乎具有恒定的大小,因此还有其他解决方案:

  • 普通C数组(例如int data[X][Y][Z]
  • 普通的一维C数组,您可以在其中自己计算索引,例如X*W*H + Y*W + Z ,在某些情况下会很方便
  • std::array ,基本上是一个C ++数组,带有一些STL集合中的合规性糖
  • std::vector ,我猜这是可以尝试的第一个解决方案
  • boost::multi_array ,它旨在支持N维数组,因此出于您的目的可能有些过分,但与矢量相比,它的数据局部性更好。

这些库向量类被设计为易于使用且相对故障安全。 它们的速度与设计中的速度一样快,但是您自己做不到(除了手工编码的组件)。 对于您正在谈论的大小(2e10个元素),我将更关注效率而不是用户友好性。 如果最内层的循环每个元素只进行很少的计算,则将发现索引计算占主导地位,这建议您进行一些展开和指针步进操作。 也许您可以指望编译器进行一些展开,但是我不在乎。)

唯一可以确定的方法是同时尝试和分析代码。 但是,作为一堆想法,这就是我想您会发现的。

  1. 对于要处理的大量元素(2e10 +),对元素的访问不会像将这些元素加载到CPU缓存中的缓存压力那么重要。 预取器将坐在那里尝试加载那些元素,这将花费大部分时间。
  2. 访问2(或3D)非连续的C数组意味着CPU必须从内存的不同部分获取内容。 boost :: multi_array通过幕后将其存储为连续块来解决该问题; 但是这样做有其自身的开销。 正如@Jack所说,带有索引的普通一维数组是最好的,即使那样,您也可以做一些事情以确保索引最小化(例如,记忆化)。
  3. 您在循环中所做的工作将极大地影响您的时间安排。 分支预测变量将是最大的贡献者。 如果这是简单的数学运算,则没有if / else语句可能会获得最佳性能,并且编译器可能会将其优化为SSE指令。 如果您有复合类型(而不是int / float / char),则必须正确布局它们以优化访问。
  4. 我几乎会建议您尝试一下,然后再提出一个新的SO问题,该问题已编写您的循环并询问如何优化该部分。 几乎总是可以为编译器提供提示,以确保它知道您的意图。

在一天结束时,尝试一下看看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM