Xはほぼ99.9%の確率で真ですが、YとZも処理する必要があります。X条件の本体は空ですが、X条件を省略した場合、他の2つの条件YとZをチェックするよりも高速であると思います。どう思いますか?
if (likely(X))
{
}
else if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
Xはほぼ99.9%の確率で真ですが、YとZも処理する必要があります。X条件の本体は空ですが、X条件を省略した場合、他の2つの条件YとZをチェックするよりも高速であると思います。どう思いますか?
if (likely(X))
{
}
else if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
可能性が高いまたは可能性が低い場合に正確に何が起こるかを知りたい場合があります:http:
//kerneltrap.org/node/4705
私は個人的に書きます
if (unlikely(!X))
{
if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
}
つまり、ifの場合x
は実行を続行し、それ以外の場合はifbodyにジャンプします。
いつものように、プロファイルが疑わしい場合。とにかく、私がそのコードを読んだ場合、私は次のようなはるかに明確なものを見つけるでしょう:
if (!likely(X))
{
if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
}
コンパイラーが想定する場合、通常、最初の条件が真であることが優先されます。
あなたは__builtin_expect
これを制御するためにのようなものを使うことができます(Ugoが詳述したように)。
ループ内にある場合は、ハードウェアも考慮事項であるため、測定する必要があります。これは、ソースとコンパイラだけではありません。キャッシュはどうですか、そして分岐予測はどのように機能していますか?プロフィール。変更します。プロフィール。比較。
yとzにありそうもないものが本当に必要ですか?あなたの質問から、xが真でない場合、yまたはzは真でなければならないように聞こえます。その場合、それらのありそうもないものは正しくないので、私はこれを使用します。
if (unlikely(!X))
{
if (Y)
{
...
}
else //Z must be true
{
...
}
}
(これは宇郷の答えにコメントしただろうが、コメントを残すほどの評判はない。)