2016-10-24 3 views
5

Gibt es aus Sicht der Optimierung und der Verzweigungsvorhersage einen Unterschied zwischen diesen beiden Codes?Starten einer Funktion mit einem Zweig

Erstens:

void think_and_do(){ 
    if(expression){ 
     //Set_A of instructions 
    } 
    else{ 
     //Set_B of instructions 
    } 
} 

int main(){ 
    think_and_do(); 
} 

Zweitens:

void do_A(){ 
    //Set_A of instructions 
} 

void do_B(){ 
    //Set_B of instructions 
} 

int main(){ 
    if(expression){ 
     do_A(); 
    } 
    else{ 
     do_B(); 
    } 
} 
+4

Ich würde denken, dass Sie den gleichen Code erhalten würden, aber es hängt vom Compiler eine Optimierung ab. Sie könnten beides kompilieren und die Baugruppe überprüfen. – NathanOliver

+1

Dies scheint eine Frage zu sein, die empirisch am besten beantwortet wird. Iterieren einige Millionen Male über einige wiederholbare pseudozufällige Daten und [messen Sie es] (http://stackoverflow.com/questions/11437523/can-measure-branch-prediction-failures-on-a-modern-intel -core-cpu? rq = 1). – dlatikay

+1

Ein Schlüssel könnte die Anzahl der Parameter sein, die für beide Funktionen benötigt werden. Im ersten Fall benötigt die Funktion 'think_and_do()' alle Parameter und im zweiten Fall nur die Funktion 'do_A()' oder 'do_B()' benötigt alle Parameter (typischerweise wenn 'do_A()' ein Objekt und 'do_B() erzeugt 'löscht dieses Objekt). –

Antwort

3

ich einen Test think_and_do auf godbolt.org und in main

Erste Beobachtung gemacht haben, wenn Ihre Beispiele trivial sind, werden sie meistens weg optimiert. Ohne die cin sollte haben beide Beispiele zusammengestellt:

xor  eax, eax 
    add  rsp, 8 #may or may not be present. 
    ret 

Zweite Beobachtung ist, dass der Code genau das gleiche in Haupt ist: und keine der Funktionen aufgerufen werden, ist alles inlined.

dritte Beobachtung ist, dass beide Beispiele den folgenden Code

mov  edx, DWORD PTR a[rip] 
    mov  eax, DWORD PTR b[rip] 
    cmp  edx, eax 
    je  .L8 

macht, dass sie eine ist füllen Zyklus von 4 Anweisung, die die meisten der Ausstellung (und ignorieren die Möglichkeit der Makro-Fusion des cmp und Sprung zu machen).

Wenn sie mit einem

cmp  edx, eax 
    je  .L8 

Die Hälfte der Ausgabe Bandbreite potenziell verschwendet hätte begonnen hatte.

+1

Ich denke, der Punkt war über Fälle, in denen Sie die Funktion – Leeor

+0

@Leeor nicht inline und die Schlussfolgerung ist, dass der Compiler inline für Sie ausführt, auch wenn Sie es nicht angeben, was es keinen Unterschied macht. – Surt

Verwandte Themen