__builtin_expect説明

2002 ワード

変換元:https://www.jianshu.com/p/2684613a300fと、また「!!」はい、bool以外の値をbool値に変換します.
この命令はgccに導入され,プログラマが最も実行可能なブランチをコンパイラに伝える役割を果たす.この命令の書き方は__builtin_expect(EXP, N)です.EXP=Nの確率が高い.
一般的な使用方法は、__builtin_expect命令をlikelyおよびunlikelyマクロにカプセル化することである.この2つのマクロの書き方は以下の通りである.
#define likely(x) __builtin_expect(!!(x), 1) //x            
#define unlikely(x) __builtin_expect(!!(x), 0) //x     

カーネル内のlikely()とunlikely()
まず、次のことを明確にします.
if(likely(value))  //    if(value)
if(unlikely(value))  //     if(value)
__builtin_expect()はGCC(version>=2.96)がプログラマーに提供するもので、「ブランチ転送」を目的としています.の情報はコンパイラに提供され、コンパイラはコードを最適化し、命令ホッピングによる性能低下を低減することができる.__builtin_expect((x),1)はxの値が本当である可能性が高いことを示す.__builtin_expect((x),0)はxの値が偽である可能性が高いことを示す.すなわち,likely()を用いるとif後の文を実行する機会が大きくなり,unlikely()を用いるとelse後の文を実行する機会が大きくなる.このようにして、コンパイラはコンパイル中に、より可能性の高いコードを起面コードに追従し、命令ジャンプによる性能の低下を低減する.
int x, y;
 if(unlikely(x > 0))
    y = 1; 
else 
    y = -1;

上記のコードでgccコンパイルされた命令はy=-1という命令を予め読み出しており,xの値が0より大きい確率が比較的小さい場合に適している.xの値がほとんどの場合0より大きい場合はlikely(x>0)を用いるべきであり,コンパイルされた命令はy=1という命令を予め読み出す.これにより、システムは実行時に指の再取り出しを減らすことができます.
作者:大明
リンク:https://www.jianshu.com/p/2684613a300f
出典:簡書
著作権は作者の所有である.商業転載は著者に連絡して許可を得てください.非商業転載は出典を明記してください.