2014-02-06 5 views
5

Ich habe eine switch Anweisung in einem zeitkritischen Code. Ich habe versucht, es mit __builtin_expect zu optimieren, aber es scheint nicht zu funktionieren. Ich frage mich, ob mir jemand sagen kann, ob mir etwas fehlt oder ob der Compiler einfach nicht dafür optimiert. Ich habe versucht, die folgenden auf meinem Host-Maschine:Können Sie builtin_expect mit switch-Anweisung verwenden

int main() { 
    volatile int v=0; 
    long i = 0; 

    for (i=0; i<1000000000L; i++) { 
      switch(__builtin_expect(v, EXPT)) { 
      case 7: 
        v=7; 
        break; 
      default: 
        v=7; 
        break; 
      } 
    } 
    return v; 
} 

Dann habe ich kompilieren und ausführen wie folgt:

~/code/builtinexpect> gcc bie.c -o bie -D EXPT=0 && time ./bie 

real 0m2.092s 
user 0m2.086s 
sys  0m0.000s 
~/code/builtinexpect> gcc bie.c -o bie -D EXPT=7 && time ./bie 

real 0m2.092s 
user 0m2.086s 
sys  0m0.000s 

I GCC Version 4.5.1 verwende.

+1

Wie sieht der erstellte Assemblercode in beiden Fällen aus? – Leeor

Antwort

4

GCC unterstützt dies auf keiner Architektur, die ich kenne. Wenn Sie eine switch Aussage haben, die einen bestimmten Fall stark bevorzugt, ist Ihre beste Zuflucht, eine if ... else switch ... Aussage zu tun. Dies würde zu der Optimierung führen, nach der Sie suchen.

3

Beiden case Zweige (und damit alle Fälle) das gleiche tun, so dass der Compiler frei ist, die gesamte Switch-Anweisung mit v=7 zu ersetzen. Selbst wenn es nicht (ohne Optimierung), würden Sie irgendeinen wirklichen Unterschied im Timing erwarten?

Aber mehr auf den Punkt, __builtin_expect als (v == EXPT) auswertet, entweder (0) oder (1), case 7: wird so nie genommen werden.

+1

Er hat keine Compiler-Optimierungen verwendet, daher sollte der Code anders sein und zu erzwungenen Fehleinschätzungen führen, aber es lohnt sich, über die Boolesche Nichtigkeit nachzudenken! – Leeor

+3

@Leeor - Ich denke, ein Branch-Prädiktor würde es mit einer Milliarde Iterationen meistens richtig machen :) –

+1

Ich würde hoffen, dass ein anständiger __builtin_expect stark genug ist, um die HW nicht zu zwingen. Diese HW-Leute müssen ihren Platz wissen :) – Leeor

Verwandte Themen