当您降至最低级别(机器代码,但我将使用汇编语言,因为它主要是一对一映射)时,空循环递减为0和一个递减为50(例如)之间的差异通常沿着的行:
ld a,50 ld a,0loop: dec a loop: inc a jnz loop cmp a,50 jnz loop
这是因为大多数零碎CPU中的零标志在达到零时由减量指令设置。当增量指令达到50时,通常不能说相同(因为该值没有什么特别之处,不像零)。因此,您需要将寄存器与50进行比较以设置零标志。
但是,请问两个循环中的哪个:
for(int i = 100000; i > 0; i--) {}for(int i = 1; i < 100001; i++) {}
更快(几乎在 任何 环境下,Java或其他情况下)都没有用,因为它们都不起作用。这两个循环的 最快
版本根本没有循环。我向任何人发起挑战,要求他们提供比这更快的版本:-)
仅当您开始在牙套内进行一些有用的工作时,它们才会变得有用,并且此时, 工作 将决定您应使用哪个顺序。
例如,如果您 需要
从1到100,000进行计数,则应使用第二个循环。这是因为递减计数(如果有的话)的优势可能会因
100000-i每次使用循环时都必须在循环内进行评估而被淹没。用汇编术语来说,这将是以下两者之间的区别:
ld b,100000 dsw a sub b,a dsw b
(
dsw当然是臭名昭著的
do something with汇编器助记符)。
由于您每次迭代只会将一次命中用于递增循环,并且每次迭代将 至少 一次将其用于减法(假设您将使用
i,否则根本不需要循环) ),则应使用更自然的版本。
如果您需要数数,请数数。如果您需要倒数,请倒数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)