Nur um es klarzustellen, ich strebe hier keine Portabilität an, also sind alle Lösungen, die mich an eine bestimmte Box binden, in Ordnung.
Grundsätzlich habe ich eine if-Anweisung, die zu 99% als wahr ausgewertet wird, und versuche, die Leistung bis zum letzten Takt herauszuholen. Kann ich eine Art Compiler-Befehl ausgeben (mit GCC 4.1.2 und x86 ISA, if it matters), um dem Branch-Prädiktor mitzuteilen, dass er für diesen Branch zwischenspeichern soll?
Mit Profile Guided Optimization kompilieren (-fprofile-generate, auf einigen Testdaten ausführen, -fprofile-use). Dann kennt gcc die Statistiken für jeden Zweig und kann den Code optimal für den schnellen Pfad auslegen. Aber builtin_expect ist immer noch eine gute Idee für Orte, an denen es hilft, falls Code ohne PGO kompiliert wird. Der Linux-Kernel hat dafür einige gute Makros (z. B. wahrscheinlich() und unwahrscheinlich()), da es schwierig ist, Profildaten für einen Kernel zu generieren.
– Peter Cordes
6. Dezember 2009 um 3:44 Uhr
MS bietet auch PGO an — blogs.msdn.com/vcblog/archive/2008/11/12/pogo.aspx.
– Hassan Syed
27. Dezember 2009 um 1:37 Uhr