我们的计算机科学老师曾经说过,出于某种原因,倒数比向上数更快。 例如,如果你需要使用一个 FOR 循环并且循环索引没有在某处使用(比如在屏幕上打印一行 N *)
我的意思是这样的代码:
for (i = N; i >= 0; i--)
putchar('*');
快于:
for (i = 0; i < N; i++)
putchar('*');
这是真的吗?如果是这样,有人知道为什么吗?
最佳答案
Is it really true? and if so does anyone know why?
在远古时代,当计算机仍由熔融 quartz 手工制成时,当 8 位微 Controller 在地球上漫游时,当你的老师还年轻(或者你老师的老师还年轻)时,有一种常见的机器指令叫做如果为零则递减并跳过 (DSZ)。 Hotshot 汇编程序员使用此指令来实现循环。后来的机器得到了更奇特的指令,但仍然有相当多的处理器,在这些处理器上,将某物与零进行比较比与其他任何东西进行比较要便宜。 (即使在某些现代 RISC 机器上也是如此,例如 PPC 或 SPARC,它们将整个寄存器保留为始终为零。)
因此,如果您设置循环以与零而不是 N
进行比较,可能会发生什么?
- 你可以保存一个寄存器
- 你可能会得到一个二进制编码更小的比较指令
- 如果前面的指令碰巧设置了一个标志(可能只在 x86 系列机器上),您甚至可能不需要显式比较指令
这些差异是否可能导致在现代乱序处理器上对真实程序进行任何可衡量的改进?不大可能。事实上,如果您即使在微基准测试中也能表现出可衡量的改进,我会印象深刻。
总结:我把你老师的脑袋打翻了!你不应该学习关于如何组织循环的过时伪事实。您应该了解到,关于循环最重要的事情是确保它们终止,产生正确答案,并且易于阅读 em>。我希望你的老师能专注于重要的东西而不是神话。
关于c - 倒数比向上数快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2823043/