倒计时比数数快吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

例如,如果需要使用for循环,并且循环索引没有在某处使用:

for (i = N; i >= 0; i--)  
  putchar('*');  

比:

for (i = 0; i < N; i++)  
  putchar('*');  

真的是真的吗?如果是的话,有谁知道原因吗?

提问于
用户回答回答于

热门程序集程序员使用这个指令来实现循环。后来机器得到了更精美的指令,但是仍然有相当多的处理器,用它来比较零的东西比和其他的任何东西相比都要便宜。(即使在一些现代的RISC机器上也是如此,比如PPC或SPARC,它们将整个寄存器保留为零。)

所以,如果你把你的循环与零进行比较,而不是N会发生什么?

  • 你可以保存一个寄存器
  • 可能会得到一个使用较小二进制编码的比较指令。
  • 如果以前的指令碰巧设置了一个标志(很可能只在x86系列计算机上),那么甚至可能不需要显式的比较指令。

这些差异会不会导致可测改进实程序在现代的无序处理器上?极不可能。事实上,如果你能在微基准上显示出一个可衡量的改进,我会印象深刻的。

用户回答回答于

下面是一些硬件上可能发生的事情,取决于编译器可以推断出所使用的数字的范围:使用增量循环测试i<N每一次循环。对于递减版本,进位标志(设置为减法的副作用)可能会自动告诉您i>=0,这样可以节省循环每一次的测试。

在现实中,在现代流水线处理器硬件上,这种东西几乎肯定是无关紧要的,因为没有从指令到时钟周期的简单的1-1映射。

扫码关注云+社区