序文
カーネルバージョン:linux 4.13
Linuxカーネルでは、if(可能性が高い(x))またはif(可能性が低い(x))ステートメントを頻繁に確認できます。この記事では、可能性のあるものとそうでないもののいくつかについて説明します。
可能性が高い
リファレンス/include/linux/compiler.h * /
# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
上記のソースコードは、組み込み関数__builtin_expectを使用して、つまり組み込み関数を定義しています。
__builtin_expectの関数プロトタイプはlong __builtin_expect(long exp、long c)であり、戻り値は完全な式expの値であり、その役割は式expの値がcと等しいことを期待することです(exp == c条件が最大の機会を保持する場合)ほとんどの場合、パフォーマンスは向上しますが、それ以外の場合はパフォーマンスが低下します)。__builtin_expect(lexp、c)の戻り値はexp値そのものであり、expの値を変更しないことに注意してください。
__builtin_expect関数は、gccが条件付き分岐予測を実行するようにガイドするために使用されます。命令の実行中、パイプラインの役割により、CPUは次の命令のフェッチを同時に完了できるため、CPU使用率を向上できます。条件付き分岐命令を実行すると、CPUは次の実行もプリフェッチしますが、条件付き分岐の結果が別の命令にジャンプする場合、CPUがプリフェッチした次の命令は役に立たないため、パイプラインの効率が低下します。
また、ジャンプ命令は、順次実行される命令よりも多くのCPU時間を消費するため、ジャンプを可能な限りスキップできる場合は、CPUのパフォーマンスを向上させることもできます。
if(可能性が高い(値))== if(値)、if(可能性が低い(値))== if(値)の表面を単純に調べます。
つまり、可能性と可能性はほとんど同じですが、実際には実行が異なります。さらに、可能性としては、値の値がtrueである可能性が高く、ifの実行の可能性がより大きく、可能性としては、値の値がfalseであることを意味します。可能性はより大きく、他を実行する機会はより大きくなります。
この変更により、バイナリコードにコンパイルされると、前のプログラムの直後に続く場合に実行ステートメントを実行し、前のプログラムの直後に次のステートメントを一意に実行することができます。これは、キャッシュによって事前に読み込まれ、プログラムの実行速度。
それでは、なぜ上記の定義でそれを使用するのですか?!シンボルはどうですか?
コンピューターのブール論理は0と1のみで、ゼロ以外は1であり、like(x)のパラメーターが論理値ではない場合に使用できます。!符号は1または0の論理値に変換されます。たとえば、次のとおりです。!(3)=!(!(3))=!0 = 1なので、パラメーター3はロジック1に変換されます。
したがって、単純な理解は次のとおりです。
可能性が高い(x)は、xが論理的に真(1)である
ことを意味し、可能性が低い(x)は、xが論理的に偽(0)であることを意味します。
Linuxカーネルから転送される可能性と可能性は低い