while (condition) {
...
}
Arbeitsablauf:
- Zustand prüfen;
- Wenn false, springen Sie zur Außenseite der Schleife.
- Führen Sie eine Iteration aus.
- nach oben springen.
if (condition) do {
...
} while (condition);
Arbeitsablauf:
- Zustand prüfen;
- Wenn false, springen Sie über die Schleife hinaus.
- Führen Sie eine Iteration aus.
- Zustand prüfen;
- Wenn dies zutrifft, fahren Sie mit Schritt 3 fort.
Wenn Sie diese beiden vergleichen, können Sie leicht erkennen, dass letztere möglicherweise überhaupt keine Sprünge ausführen, vorausgesetzt, es gibt genau einen Schritt durch die Schleife, und im Allgemeinen ist die Anzahl der Sprünge um eins geringer als die Anzahl der Iterationen. Ersterer muss zurückspringen, um die Bedingung zu überprüfen, und nur dann aus der Schleife springen, wenn die Bedingung falsch ist.
Sprünge auf modernen Pipeline-CPU-Architekturen können sehr teuer sein: Da die CPU die Ausführung der Überprüfungen vor dem Sprung beendet, befinden sich die Anweisungen über diesen Sprung hinaus bereits in der Mitte der Pipeline. Diese gesamte Verarbeitung muss verworfen werden, wenn die Verzweigungsvorhersage fehlschlägt. Die weitere Ausführung wird verzögert, während die Pipeline erneut gestartet wird.
Erläuterung der erwähnten Verzweigungsvorhersage : Für jede Art von bedingtem Sprung verfügt die CPU über zwei Anweisungen, die jeweils eine Wette auf das Ergebnis enthalten. Zum Beispiel würden Sie am Ende einer Schleife eine Anweisung mit der Aufschrift " Sprung, wenn nicht Null, Wetten auf Nicht Null " einfügen, da der Sprung bei allen Iterationen mit Ausnahme der letzten ausgeführt werden muss. Auf diese Weise beginnt die CPU, ihre Pipeline mit den Anweisungen zu pumpen, die dem Sprungziel folgen, anstatt denen, die der Sprunganweisung selbst folgen.
Wichtige Notiz
Bitte nehmen Sie dies nicht als Beispiel für die Optimierung auf Quellcode-Ebene. Das wäre völlig falsch, da der JIT-Compiler, wie bereits aus Ihrer Frage hervorgeht, die Umwandlung von der ersten in die zweite Form routinemäßig und völlig eigenständig durchführt.