我刚刚开始从事一个速度非常重要的科学项目(HPC)。我目前正在设计数据结构。该项目的核心是一个三维网格的双值,以解决偏微分方程。
由于这里的速度可能比代码的简单性更重要,所以我想知道与通常的C样式数组相比,STL的性能如何。在我的例子中,由于它是一个3D网格,我考虑的是a)一个具有线性索引的一维向量b)一个由3个向量组成的向量或者c)一个一维c样式数组或者d)一个三维c样式数组。
我查找了更老的问题,但我只发现了与构造/销毁有关的问题(这在这里并不重要,因为数据结构只在程序启动时创建一次-快速索引和计算很重要)或不同STL容器的比较。
感谢你的帮助
发布于 2013-02-21 04:00:28
很难(甚至不可能)提前说出相对性能会是什么。(在现代机器上,由于局部性差,乘法通常比页面未命中更便宜。在较老的机器上,乘法是昂贵的,而且没有缓存,所以位置不会有什么不同。)
此外,根据机器和库实现的不同,对这个平面向量使用std::vector可能比使用指向内存的简单指针更昂贵(也可能不是--您不能提前知道)。
发布于 2013-02-21 03:49:24
1D和3D阵列的存储器布局将是相同的,并且类似于线性std::vector的存储器布局。我会采用这种方法:一个一维向量和一个内联函数来映射到适当的位置。
另一方面,矢量的矢量具有完全不同的布局,因为矢量中的数据不存储在对象内部,而是动态分配和引用。
发布于 2013-02-21 03:50:24
向量将在内部完成您需要手动完成的工作,以便处理单独大小的原始数组,因此,只要正确使用,向量应该与执行相同任务的原始数组执行相同的操作。
例如,单个向量应该与一维c数组执行相同的操作,向量的向量应该执行与使用原始指针数组时大致相同的操作,指针的每个元素都指向一个数组。
然而,如果3d数组具有统一的维度大小(即,不是参差不齐的数组),则向量支付额外的成本来单独管理它们的大小(例如,它们必须单独地存储它们的大小)。如果在编译时知道任何维度大小,那么最好使用'STL‘容器’std::array arrays`::, because it won't have that unnecessary overhead. You can even have multi-dimentional`:
template<typename T, int Planes, int Rows, Cols>
using Matrix = std::array<std::array<std::array<T,Cols>,Rows>,Planes>;虽然不是严格要求,但这应该与T arr[Planes][Rows][Cols];相同,但没有原始c数组的问题。
https://stackoverflow.com/questions/14988617
复制相似问题