扫描std :: array,向前和向后扫描

时间:2014-03-02 15:46:25

标签: c++ performance

我想尽快通过std :: array进行线性扫描。我应该向前扫描(从索引0到索引n)还是向后扫描(从索引n到索引0),或者它是否重要?

2 个答案:

答案 0 :(得分:4)

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

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

尝试进行微优化的人的标准提醒:对运行时间占1%的事物进行无限的性能提升需要付出无限的努力,并且会产生1%的改进。占运行时间10%的东西的10%的改进需要更少的努力并产生相同的好处。 不要浪费时间微观优化错误的东西。进行适当的性能分析并指导您 - 并记住算法或数据结构的变化可能比调整一些更有效率指令。

答案 1 :(得分:2)

这在很大程度上取决于实际情况。

这里有两件事要考虑。

首先是循环开销,向后(n - > 0)循环在技术上可能会快一点。但这只有在循环非常紧密时才有意义,即循环体足够微不足道,并且它的逻辑基本上不会受到顺序的影响。

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

一个非常非常的一般答案可能是:for循环具有非平凡的主体且足够大n 应该几乎没有差别。

但实际的答案是:它很复杂,如果你怀疑它有可能产生任何实质性的性能差异,唯一的方法是测试它。

相关问题