C++ 扫描标准::阵列,向前与向后

C++ 扫描标准::阵列,向前与向后,c++,performance,C++,Performance,我想尽可能快地通过std::数组进行线性扫描。我应该向前扫描(从索引0到索引n)还是向后扫描(从索引n到索引0),或者这有什么关系吗?传统上,建议是从n到0进行扫描,因为在大多数体系结构中,与循环中的零比较控制比与其他数字相比更便宜。(正如其他人所指出的,预取缓存可能会也可能不会否定这一优势,这同样取决于体系结构的细节。) 要确定这是否真的会对您的场景产生影响——鉴于您在循环体中所做的工作,这是否是一个重要的影响——以及循环是否会对您的应用程序的性能产生任何影响——需要对您的特定代码和体系结构进

我想尽可能快地通过std::数组进行线性扫描。我应该向前扫描(从索引0到索引n)还是向后扫描(从索引n到索引0),或者这有什么关系吗?

传统上,建议是从n到0进行扫描,因为在大多数体系结构中,与循环中的零比较控制比与其他数字相比更便宜。(正如其他人所指出的,预取缓存可能会也可能不会否定这一优势,这同样取决于体系结构的细节。)

要确定这是否真的会对您的场景产生影响——鉴于您在循环体中所做的工作,这是否是一个重要的影响——以及循环是否会对您的应用程序的性能产生任何影响——需要对您的特定代码和体系结构进行更多的分析,或者一些真实世界的测试


尝试微优化的人的标准提醒:对占运行时1%的内容进行无限的性能改进需要无限的努力,并产生1%的改进。对占运行时间10%的内容进行10%的改进,所需的工作量要少得多,并产生相同的好处。不要浪费时间在错误的事情上。进行适当的性能分析,并以此为指导——记住,算法或数据结构的更改可能比调整一些指令更有效率。

传统上,建议是扫描n到0,因为在大多数体系结构中,与零在环控制相比比其他数字更便宜。(正如其他人所指出的,预取缓存可能会也可能不会否定这一优势,这同样取决于体系结构的细节。)

要确定这是否真的会对您的场景产生影响——鉴于您在循环体中所做的工作,这是否是一个重要的影响——以及循环是否会对您的应用程序的性能产生任何影响——需要对您的特定代码和体系结构进行更多的分析,或者一些真实世界的测试


尝试微优化的人的标准提醒:对占运行时1%的内容进行无限的性能改进需要无限的努力,并产生1%的改进。对占运行时间10%的内容进行10%的改进,所需的工作量要少得多,并产生相同的好处。不要浪费时间在错误的事情上。进行适当的性能分析,并以此为指导——记住,算法或数据结构的更改可能比调整一些指令更有效率。

这在很大程度上取决于实际场景

<这里有两件事要考虑。

首先是循环开销,向后(
n
->
0
)循环在技术上可能要快一点。但这只有在循环非常紧密的情况下才有意义,也就是说,循环体足够简单,并且它的逻辑基本上不受顺序的影响

另一件事是内存访问,从历史上看,CPU在缓存/预取转发方面会更好,但现在它们两种方式都做得很好。问题是,这并不简单,因为它取决于实际的访问模式和CPU

一个非常、非常普遍的答案可能是:对于具有非平凡体且足够大的
n
的循环,应该几乎没有区别


但实际答案是:这很复杂,如果您怀疑它可能会带来任何实质性的性能差异,唯一的判断方法就是测试它。

这在很大程度上取决于实际场景

<这里有两件事要考虑。

首先是循环开销,向后(
n
->
0
)循环在技术上可能要快一点。但这只有在循环非常紧密的情况下才有意义,也就是说,循环体足够简单,并且它的逻辑基本上不受顺序的影响

另一件事是内存访问,从历史上看,CPU在缓存/预取转发方面会更好,但现在它们两种方式都做得很好。问题是,这并不简单,因为它取决于实际的访问模式和CPU

一个非常、非常普遍的答案可能是:对于具有非平凡体且足够大的
n
的循环,应该几乎没有区别


但实际答案是:这很复杂,如果您怀疑它可能会带来任何实质性的性能差异,唯一的判断方法就是测试它。

如果您认为这很重要,您应该能够在实际运行场景中对其进行测量。这是唯一可以确定的方法。复杂性是一样的,但缓存性能可能会影响实际性能。我会继续前进。我强烈反对以“主要基于意见”的方式结束这篇文章。这是一个可教的时刻,我认为我们应该利用它来说明为什么真正的答案是重新考虑这个问题。如果你认为这可能很重要,你应该能够在现实的运行场景中衡量它。这是唯一可以确定的方法。复杂性是一样的,但缓存性能可能会影响实际性能。我会继续前进。我强烈反对以“主要基于意见”的方式结束这篇文章。这是一个可教的时刻,我认为我们应该利用它来说明为什么真正的答案是重新考虑这个问题。+1对于“尝试微优化的人的标准提醒”,任何当前的编译器在微优化+1方面都比人类好得多,尽管我担心一些读者,你的第一段将是唯一能被理解的段落。因此,用粗体字来提醒大家注意最后一段。但我想从回答问题开始,然后进一步解释为什么这个问题可能是错误的。谢谢你的回答。我没有想过零比较会更快,我主要是骗人的