考虑for循环的示例:
for(int i = 0; i <= NUM; i++); // forward
for(int i = NUM; i >= 0; i--); // reverse
Run Code Online (Sandbox Code Playgroud)
我用gcc(linux-64)测试了这个循环.没有任何优化标志,前向循环更快,并且优化到O3/O4,反向循环更快.
在某处我听说由于更好的缓存替换技术,前向循环更快.
我个人认为,反向循环应该更快(无论NUM是常数还是变量).因为任何微处理器都有单指令用于与0比较i >= 0(即JLZ (jump if less than zero)等效).
对此有任何确定性的答案吗?
不,这绝对没有确定性的答案.您正在研究两种不同的抽象层次.
对于幕后发生的事情,性能方面,C++绝对没有什么可说的.它指定了一个执行C++代码的虚拟机,虽然它涵盖了功能,但它不包括底层环境的性能(a).
其中哪一项更快将取决于多种因素.您可能会发现自己在CPU上运行,在与任意值进行比较和与零进行比较之间没有区别.
您可能会发现一种体系结构,其中递增寄存器的速度比递减寄存器快十倍,尽管可能看起来很奇怪.
你甚至可能找到一个没有减量,加减指令的脑死亡架构,你必须通过调用增量2 n -1次来模拟减量(n字大小在哪里).
一句话:除非你想看一个非常具体的CPU,编译器等,你不能假设知道幕后发生了什么.
您应该首先优化代码的可读性.如果您需要以越来越多的方式处理事物,请使用第一个选项.如果减少方式,使用后者.如果任何一种方式看起来同样自然,那么选择最快的方法,通过基础架构和汇编代码的基准测试或分析来发现.但只有在遇到特定的性能问题时才这样做,否则你就会浪费精力.
在任何情况下,因为你几乎可以肯定将要使用 i的东西,很可能是因为您要以最快的方式将超过的事实,你现在要计算淹没得到任何微小的性能提升NUM-i循环内(当然,除非编译器比开发人员更聪明,根据我所见gcc,开发人员很可能.
(a)它确实指定了某些与性能相关的东西,例如容器库中某些东西的时间复杂度,但没有特别指出你要问的东西,前向循环或反向循环是否更快.