当您到达最低级别时(机器代码,但我将使用汇编,因为它主要一对一映射),空循环递减到 0 和 1 递增到 50(例如)之间的差异通常沿着行:
ld a,50 ld a,0
loop: 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++) {}
更快(几乎any环境、Java 或其他)是无用的,因为它们都没有做任何有用的事情。这fastest这两个循环的版本根本没有循环。我挑战任何人想出比这更快的版本:-)
只有当您开始在大括号内做一些有用的工作时,它们才会变得有用,此时,work将决定您应该使用哪个顺序。
例如,如果您need要从 1 计数到 100,000,您应该使用第二个循环。这是因为倒计时的优势(如果有的话)很可能会被你必须评估的事实所淹没100000-i
每次需要使用它时都在循环内。在装配方面,这将是以下之间的区别:
ld b,100000 dsw a
sub b,a
dsw b
(dsw
当然是臭名昭著的do something with
汇编助记符)。
因为每次迭代您只会受到一次递增循环的影响,并且您将受到减法的影响at least每次迭代一次(假设您将使用i
,否则根本不需要循环),您应该使用更自然的版本。
如果需要计数,就计数。如果需要倒数,就倒数。