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();
}
}
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
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
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). –