C++ 哪个是C+中最快的STL数据结构+;迭代大量元素?

C++ 哪个是C+中最快的STL数据结构+;迭代大量元素?,c++,stl,C++,Stl,元素遵循某种属性,其中每个元素通过某种复杂关系与其前一个元素相关(假设没有已知的简单公式来找出第i个元素)我想计算这个系列中某个元素的值,我必须计算每个元素的值,在这个过程中迭代元素的完整列表 我使用了一个数组,它可能导致了一些内存分配错误(SIGABRT)。 我用了一个向量,同样的错误。可能是因为元素的数量很大,并且它们是连续存储的。 然后我使用了一个列表,没有这样的错误,但是它所花费的时间超过了可接受的时间限制。现代CPU最擅长顺序访问。在两个方向上按顺序迭代阵列时,访问时间最快,因为硬件预

元素遵循某种属性,其中每个元素通过某种复杂关系与其前一个元素相关(假设没有已知的简单公式来找出第i个元素)我想计算这个系列中某个元素的值,我必须计算每个元素的值,在这个过程中迭代元素的完整列表

我使用了一个数组,它可能导致了一些内存分配错误(SIGABRT)。 我用了一个向量,同样的错误。可能是因为元素的数量很大,并且它们是连续存储的。
然后我使用了一个列表,没有这样的错误,但是它所花费的时间超过了可接受的时间限制。

现代CPU最擅长顺序访问。在两个方向上按顺序迭代阵列时,访问时间最快,因为硬件预取器设计用于识别这种访问模式,并在开始访问数据之前将数据预取到一级缓存中

换句话说,
std::vector
std::array
是顺序迭代中最快的

有关详细信息,请参阅“英特尔64和IA-32体系结构优化参考手册”2.2.5.4数据预取:

。。。预取器的目标是自动预测程序将使用哪些数据。如果该数据不靠近执行核心或内部缓存,则预取器会将其从下一级缓存层次结构中取出 还有记忆。预取具有以下效果:

•如果数据按程序中使用的顺序排列,则可提高性能

•如果访问模式是稀疏的而不是本地的,则可能会由于带宽问题导致性能轻微下降

•在极少数情况下,如果算法的工作集被调整为占用大部分缓存,并且不必要的预取会逐出程序所需的行,则硬件预取器可能会由于一级缓存容量而导致严重的性能下降

数据预取到一级数据缓存

当满足以下条件时,数据预取由加载操作触发:

•加载来自写回内存类型

•预取数据与触发该数据的加载指令位于同一4K字节页面内

•管道中没有围栏

•没有很多其他负载未命中正在进行中

•没有源源不断的商店


现代CPU最擅长顺序存取。在两个方向上按顺序迭代阵列时,访问时间最快,因为硬件预取器设计用于识别这种访问模式,并在开始访问数据之前将数据预取到一级缓存中

换句话说,
std::vector
std::array
是顺序迭代中最快的

有关详细信息,请参阅“英特尔64和IA-32体系结构优化参考手册”2.2.5.4数据预取:

。。。预取器的目标是自动预测程序将使用哪些数据。如果该数据不靠近执行核心或内部缓存,则预取器会将其从下一级缓存层次结构中取出 还有记忆。预取具有以下效果:

•如果数据按程序中使用的顺序排列,则可提高性能

•如果访问模式是稀疏的而不是本地的,则可能会由于带宽问题导致性能轻微下降

•在极少数情况下,如果算法的工作集被调整为占用大部分缓存,并且不必要的预取会逐出程序所需的行,则硬件预取器可能会由于一级缓存容量而导致严重的性能下降

数据预取到一级数据缓存

当满足以下条件时,数据预取由加载操作触发:

•加载来自写回内存类型

•预取数据与触发该数据的加载指令位于同一4K字节页面内

•管道中没有围栏

•没有很多其他负载未命中正在进行中

•没有源源不断的商店

你可以试试

与std::vector相反,deque的元素不存储 连续:典型的实现分别使用一系列 分配的固定大小数组

DEQUE上常见操作的复杂性(效率)如下 如下:

Random access - constant O(1)
Insertion or removal of elements at the end or beginning - constant O(1)
Insertion or removal of elements - linear O(n)
你可以试试

与std::vector相反,deque的元素不存储 连续:典型的实现分别使用一系列 分配的固定大小数组

DEQUE上常见操作的复杂性(效率)如下 如下:

Random access - constant O(1)
Insertion or removal of elements at the end or beginning - constant O(1)
Insertion or removal of elements - linear O(n)

描述中没有说明为什么需要存储整个序列(与计算相反)。如果你解释了原因,你可能会得到一个更好的答案。一个列表实际上需要更多的内存,但不是连续的。然而,在这个64位计算的时代,连续内存限制实际上已经消失了。您确实编译了64位,对吗?“我使用了一个向量,同样的错误。”-您是如何使用
向量的?如果您可以
reserve()
预先预留足够的容量,就可以避免可能代价高昂的大小调整,这涉及到临时需要的内存当前元素使用量的3倍左右(其中2/3需要是连续的)。如果你不能合理地提前预留,那么宋元尧的建议很好,因为
deque
将分配成更小的块。你可以存储中间值,并通过从最近存储的邻居计算来插值缺少的值。。描述中没有说明为什么需要存储整个序列(相反