Die kanonische Weise statische Verzweigungsvorhersage zu tun ist, dass if
wird vorhergesagt, nicht-verzweigte (dh jede if
Klausel ausgeführt wird, nicht else
) und Schleifen und Rückwärts- goto
s sind genommen. Geben Sie also nicht den gemeinsamen Fall in else
ein, wenn Sie erwarten, dass die statische Vorhersage signifikant ist. Es ist nicht so einfach, sich in einer noch nicht erreichten Schleife fortzubewegen. Ich habe es nie ausprobiert, aber ich nehme an, es sollte ziemlich gut funktionieren, wenn man es in eine else
-Klausel steckt.
Viele Compiler unterstützen irgendeine Form von #pragma unroll
, aber es wird immer noch notwendig sein, es mit einer Art von #if
zu schützen, um andere Compiler zu schützen.
Branch Prädiktion Hinweise können theoretisch eine vollständige Beschreibung, wie ein Flow-Control-Diagramm eines Programms zu transformieren und die grundlegenden Blöcke in ausführbaren Speicher anzuordnen Ausdruck ... so gibt es eine Vielzahl von Dingen auszudrücken, und die meisten werden nicht sehr portabel sein .
Wie von GNU in der Dokumentation für __builtin_expect
empfohlen, ist die profilgeführte Optimierung den Hinweisen überlegen und mit weniger Aufwand.
Ich frage mich, ob das etwas C++ 0x Attribute sein könnte, um Bedingungen für 'if' festzuhalten? Wie 'if ([[unwahrscheinlicher]] unwahrscheinlicher_Zustand) {...}'? Zur Zeit erlaubt die Syntax das nicht. Es erlaubt jedoch 'if ([[unwahrscheinliche]] bool b = ...) {}'. Vielleicht könnte man das missbrauchen :) –
GNU-Code enthält eine lächerliche Menge von 'if (wahrscheinlich (...))' Junk in völlig nicht-Performance-kritischen Code, und IMO das ist wirklich schlecht. Zum einen liest es sich nicht natürlich auf Englisch - es klingt wie "wenn diese Bedingung wahrscheinlich wahr ist" statt "wenn diese Bedingung wahr ist, was es wahrscheinlich ist". Und zum anderen ist es nur Unordnung. Wenn Sie nicht viele leistungskritische Bedingungen haben, die nicht bereits nach 'cmov' oder ähnlichem kompilieren, ignorieren Sie einfach Verzweigungsvorhersage-Hinweise. –
@R .. Ich denke ich verstehe, warum der Linux-Kernel mit 'if (unwahrscheinlicher (...)) 'übersät ist. Sie bevorzugen frühe Exits, die den Codefluss leichter nachvollziehen lassen. Wenn sie dies nicht tun würden, würde die statische Verzweigungsvorhersage immer fehlschlagen. –