最適化と分岐予測の観点から、これらの2つのコードには違いがありますか?ブランチ付きファンクションの開始
まず:
void think_and_do(){
if(expression){
//Set_A of instructions
}
else{
//Set_B of instructions
}
}
int main(){
think_and_do();
}
第二:あなたの例であれば、私は、think_and_doをgodbolt.orgにしてmain
最初の観測でテストを行った
void do_A(){
//Set_A of instructions
}
void do_B(){
//Set_B of instructions
}
int main(){
if(expression){
do_A();
}
else{
do_B();
}
}
私はあなたが同じコードを得るだろうと思うだろうが、それはコンパイラ最適化の設定に依存します。両方をコンパイルしてアセンブリをチェックすることができます。 – NathanOliver
これは経験的に最もよく答える質問のようです。いくつかの反復可能な擬似ランダムデータに対して数百万回反復し、[測定する](http://stackoverflow.com/questions/11437523/can-i-measure-branch-prediction-failures-on-a-modern-intel -core-cpu?rq = 1)。 – dlatikay
1つのキーは、両方の機能に必要なパラメータの数になります。関数 'do_A()'または 'do_B()'のみがすべてのパラメータを必要とする場合(通常 'do_A()'がオブジェクトを作成し、 'do_B()'がすべてのパラメータを持つ必要があります) 'このオブジェクトを削除します)。 –