Ich erinnere mich an meine Tage, als wir 8086 Assembly am College machten, war es performanter:
for (int i = 6; i > -1; i--)
da es eine JNS- Operation gab, die Jump if No Sign bedeutet. Dies bedeutete, dass nach jedem Zyklus keine Speichersuche durchgeführt wurde, um den Vergleichswert zu erhalten, und auch kein Vergleich. Heutzutage optimieren die meisten Compiler die Registernutzung, sodass die Speichersache nicht mehr wichtig ist, Sie aber dennoch einen nicht benötigten Vergleich erhalten.
Übrigens führt das Einfügen von 7 oder 6 in Ihre Schleife eine " magische Zahl " ein. Zur besseren Lesbarkeit sollten Sie eine Konstante mit einem absichtlichen Namen verwenden. So was:
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
EDIT: Die Leute bekommen die Montagesache nicht, daher ist offensichtlich ein vollständigeres Beispiel erforderlich:
Wenn wir für (i = 0; i <= 10; i ++) tun, müssen Sie dies tun:
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Wenn wir für (int i = 10; i> -1; i--) tun, können Sie damit durchkommen:
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
Ich habe es gerade überprüft und der C ++ - Compiler von Microsoft führt diese Optimierung nicht durch, aber wenn Sie Folgendes tun:
for (int i = 10; i >= 0; i--)
Die Moral lautet also: Wenn Sie Microsoft C ++ † verwenden und das Auf- oder Absteigen keinen Unterschied macht, sollten Sie Folgendes verwenden, um eine schnelle Schleife zu erhalten:
for (int i = 10; i >= 0; i--)
eher als eines von diesen:
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
Offen gesagt ist es jedoch weitaus wichtiger, die Lesbarkeit von "for (int i = 0; i <= 10; i ++)" zu erhalten, als einen Prozessorbefehl zu verpassen.
† Andere Compiler können andere Dinge tun.