__builtin_expect説明
__builtin_expect Description
このディレクティブはgccによって導入され、その役割は プログラマーが、実行する可能性が最も高いブランチをコンパイラーに通知できるようにします 。この命令は次のように記述されます:
__builtin_expect(EXP, N)
。
EXP == Nの確率が非常に大きいことを意味します。
一般的な使用方法は__builtin_expect
命令パッケージはlikely
with unlikely
Macroです。これら2つのマクロは次のように記述されています。
#define likely(x) __builtin_expect(!!(x), 1) //x is probably true #define unlikely(x) __builtin_expect(!!(x), 0) //x is probably false
カーネル内のLike()およびlikely()
最初に明確にすること:
If(likely(value)) // is equivalent to if(value) If(unlikely(value)) // is also equivalent to if(value)
__builtin_expect()
GCC(バージョン> = 2.96)は、コンパイラーに「ブランチ転送」情報を提供するためにプログラマーに提供されます。これにより、コンパイラーはコードを最適化して、命令ジャンプによるパフォーマンスの低下を減らすことができます。 __builtin_expect((x),1)
xの値が真である可能性が高い __builtin_expect((x),0)
xの値が偽である可能性が高くなります。
つまり、use likely()
、ifの後にステートメントを実行する可能性が大きいほど、use unlikely()
elseの後にステートメントを実行する可能性が高くなります。このようにして、コンパイラはコンパイルプロセスでより可能性の高いコードに従うため、命令ジャンプによって引き起こされるパフォーマンスの低下が軽減されます。
例
int x, y if(unlikely(x > 0)) y = 1 else y = -1
上記のコードでは、gccでコンパイルされた命令はy = -1命令を先読みします。これは、xの値が0より大きい確率が小さい場合に適しています。ほとんどの場合、xの値が0より大きい場合は、possible(x> 0)を使用して、コンパイルされた命令が事前に命令y = 1を読み取るようにする必要があります。このようにして、システムは実行中の再フェッチを減らします。
著者:よく理解している
リンク:https://www.jianshu.com/p/2684613a300f
出典:ショートブック
本の著作権は著者が所有しています。いかなる形式の転載も、承認と出典について著者が連絡する必要があります。