我记得我们在大学做 8086 组装的时候,它的性能更高:
for (int i = 6; i > -1; i--)
因为有一个JNS操作意味着如果没有符号则跳转。使用这意味着在每个周期之后没有内存查找来获取比较值,也没有比较。如今,大多数编译器都优化了寄存器的使用,因此内存不再重要,但您仍然可以获得不需要的比较。
顺便说一句,将 7 或 6 放入循环中就是引入了一个“幻数”。为了更好的可读性,您应该使用带有 Intent Revealing Name 的常量。像这样:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
编辑:人们没有得到组装的东西,所以显然需要一个更完整的例子:
如果我们为 (i = 0; i <= 10; i++) 你需要这样做:
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
如果我们为 (int i = 10; i > -1; i--) 做,那么你可以摆脱这个:
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
我刚刚检查了一下,微软的 C++ 编译器没有做这个优化,但如果你这样做了:
for (int i = 10; i >= 0; i--)
所以道德是,如果您使用的是 Microsoft C++†,并且升序或降序没有区别,要获得一个快速循环,您应该使用:
for (int i = 10; i >= 0; i--)
而不是其中任何一个:
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
但坦率地说,获得“for (int i = 0; i <= 10; i++)”的可读性通常比错过一个处理器命令重要得多。
† 其他编译器可能会做不同的事情。