Die Anzahl der Anweisungen, die Sie im Quellcode schreiben, bezieht sich nicht ausschließlich auf die Anzahl der Maschinenanweisungen, die der Compiler generiert.
Die meisten Compiler sind intelligenter und in Ihrem zweiten Beispiel kann wie Code erzeugen:
operation();
operation();
operation();
operation();
operation();
automatisch, weil sie erkennen, dass die Schleife immer 5-mal durchlaufen wird.
Auch wenn Sie tun, um eine Profilierung orientierte Optimierung und der Compiler sieht, dass eine Schleife hat winzige einen Körper und eine sehr hohe Wiederholungs zählen sie es sogar für eine generische Anzahl von Iterationen mit Code wie entrollen kann:
while (count >= 5) {
operation();
operation();
operation();
operation();
operation();
count -= 5;
}
while (count > 0) {
operation();
count--;
}
Dies wird für große count
s etwa ein Fünftel der Tests im Vergleich zu der naiven Version machen.
Ob das wert ist oder nicht, ist etwas, was nur Profiling sagen kann.
Eine Sache, die Sie tun können, wenn Sie sicher sind, dass der Code ausgeführt werden muss, mindestens einmal ist
do {
operation();
} while (--count);
statt
while (count--) {
operation();
}
Die Möglichkeit, zu schreiben, dass count==0
etwas ärgerlich für CPUs, da in dem von den meisten Compilern generierten Code ein zusätzlicher JMP-Forward erforderlich ist:
der Maschinencode für die do { ... } while
Version stattdessen ist einfach
loop:
... opertion ...
... do the test...
jne loop
Das ist nichts, was Sie tun sollten. Ihr Compiler entrollt bereits Schleifen, wenn es effektiver ist. – ThiefMaster
Warum möchten Sie das tun? Es wird mehr Platz im Befehlscache benötigen, mehr Dekodierung von Befehlen erfordern und grundsätzlich schlechter sein. Wenn es besser wäre, würde der Compiler es nicht für Sie konvertieren? (Es sei denn, es ist ein Stück Müll, in welchem Fall warum verwenden Sie es?) –