Branch Prediction und Hot Loops
Unterstützen Sie die CPU bei der Verzweigungsvorhersage und schreiben Sie Schleifen, die der Compiler optimieren kann.
Branch Prediction und Hot Loops ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Der Branch-Prädiktor
Moderne CPUs sagen die nächste Instruktion voraus, bevor die vorherige abgeschlossen ist. Ist die Vorhersage falsch, kommt die Pipeline zum Stillstand – das kostet 10–20 Zyklen.
Vorhersagbare Verzweigungen
Verzweigungen, die fast immer in dieselbe Richtung gehen (oder einem klaren Muster folgen), werden gut vorhergesagt. Zufällige Verzweigungen sind verheerend.
Sortierte Daten helfen
Die Iteration über sortierte Daten mit einer Bedingung ist oft schneller als über unsortierte Daten – der Prädiktor lernt das Muster.
// Often much faster on sorted data
std::sort(v.begin(), v.end());
int sum = 0;
for (int x : v) {
if (x > 128) sum += x;
}Branchless Code
Ersetzen Sie Verzweigungen nach Möglichkeit durch Arithmetik. Die CPU wertet beide Pfade aus und wählt ohne Verzweigung einen davon aus.
// Branchy
int max(int a, int b) { return (a > b) ? a : b; }
// Branchless (often equivalent in machine code)
int max(int a, int b) { return a + (b - a) * (b > a); }std::max als bessere Wahl
Moderne Compiler erzeugen oft automatisch Branchless Code. Schreiben Sie einfach klaren Code und lassen Sie den Optimizer arbeiten – untersuchen Sie bei Hotpaths dennoch die Disassemblierung.
Likely- und Unlikely-Hinweise
C++20 hat [[likely]] und [[unlikely]] eingeführt, um dem Compiler einen Hinweis zu geben.
if (error_condition) [[unlikely]] {
handle_error();
}Schleifenabwicklung
Mehr Arbeit pro Iteration verringert die Häufigkeit von Verzweigungen. Moderne Compiler wickeln Schleifen selbstständig ab; verwenden Sie #pragma unroll nur, wenn Messungen zeigen, dass es hilft.
Gemischte Arbeitslasten in Schleifen vermeiden
Eine Schleife mit zwei Fällen, die sich zufällig abwechseln, verhindert eine zuverlässige Vorhersage. Teilen Sie sie nach Möglichkeit in zwei Schleifen auf, eine pro Fall.
// Slow: random switching
for (auto& x : v) {
if (x.type == A) process_A(x);
else process_B(x);
}
// Faster: partition first
std::partition(v.begin(), v.end(), [](auto& x) { return x.type == A; });
for (size_t i = 0; i < boundary; ++i) process_A(v[i]);
for (size_t i = boundary; i < v.size(); ++i) process_B(v[i]);Häufig verwendete Funktionen inline ausführen
Der Overhead eines Funktionsaufrufs kann in häufig ausgeführten Schleifen genauso groß sein wie der Funktionskörper. Hinweise mit inline helfen; __attribute__((always_inline)) (GCC/Clang) ist strenger.
Vertrauen Sie nicht Ihrer Intuition
Compiler und CPUs sind sehr intelligent. Messen Sie vor der Optimierung. Die „offensichtlich“ branchless Variante kann langsamer sein als die Variante mit Verzweigung, sobald der Prädiktor trainiert ist.
SIMD für breite Schleifen
Autovektorisierung wandelt eine Schleife in SIMD-Instruktionen um, wenn dies möglich ist. Verwenden Sie sauberen Code und einfache Typen und vermeiden Sie Datenabhängigkeiten zwischen den Iterationen.
Profiling-Guided Optimization (PGO)
Kompilieren Sie das Programm, führen Sie es aus, sammeln Sie Profildaten und kompilieren Sie es mit diesen Hinweisen erneut. Compiler verwenden die Daten, um besser vorherzusagen, welche Verzweigungen häufig ausgeführt werden.
Schnelltest
Warum kann das Sortieren von Daten vor einer Filterschleife die Ausführung manchmal beschleunigen?
Zusammenfassung
Falsch vorhergesagte Verzweigungen kosten Zyklen. Halten Sie Verzweigungen vorhersagbar (sortierte Daten helfen), verwenden Sie Likely-/Unlikely-Hinweise, teilen Sie Arbeitslasten auf, damit Schleifen einheitlich bleiben, und vertrauen Sie auf die Optimierung durch den Compiler, sofern das Profiling nichts anderes zeigt.
Häufig gestellte Fragen
Ist die Lektion „Branch Prediction und Hot Loops“ kostenlos?
Ja — der vollständige Text von „Branch Prediction und Hot Loops“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Branch Prediction und Hot Loops“?
Unterstützen Sie die CPU bei der Verzweigungsvorhersage und schreiben Sie Schleifen, die der Compiler optimieren kann. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C++ Academy zu starten?
Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Branch Prediction und Hot Loops“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?
Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Cachefreundliche Datenlayouts
- Branch Prediction und Hot Loops
- Profiling mit perf, VTune und Sanitizern
- Microbenchmarking mit Google Benchmark