8

Xはほぼ99.9%の確率で真ですが、YとZも処理する必要があります。X条件の本体は空ですが、X条件を省略した場合、他の2つの条件YとZをチェックするよりも高速であると思います。どう思いますか?

if (likely(X))
{
}
else if (unlikely(Y))
{
...
}
else if (unlikely(Z))
{
...
}
4

4 に答える 4

11

可能性が高いまたは可能性が低い場合に正確に何が起こるかを知りたい場合があります:http:
//kerneltrap.org/node/4705

私は個人的に書きます

if (unlikely(!X))
{
  if (unlikely(Y))
  {
  ...
  }
  else if (unlikely(Z))
  {
   ...
  }
}

つまり、ifの場合xは実行を続行し、それ以外の場合はifbodyにジャンプします。

于 2012-01-19T22:03:58.223 に答える
8

いつものように、プロファイルが疑わしい場合。とにかく、私がそのコードを読んだ場合、私は次のようなはるかに明確なものを見つけるでしょう:

if (!likely(X))
{
    if (unlikely(Y))
    {
    ...
    }
    else if (unlikely(Z))
    {
    ...
    }
}
于 2012-01-19T21:49:39.030 に答える
1

コンパイラーが想定する場合、通常、最初の条件が真であることが優先されます。

あなたは__builtin_expectこれを制御するためにのようなものを使うことができます(Ugoが詳述したように)。

ループ内にある場合は、ハードウェアも考慮事項であるため、測定する必要があります。これは、ソースとコンパイラだけではありません。キャッシュはどうですか、そして分岐予測はどのように機能していますか?プロフィール。変更します。プロフィール。比較。

于 2012-01-19T22:09:30.703 に答える
0

yとzにありそうもないものが本当に必要ですか?あなたの質問から、xが真でない場合、yまたはzは真でなければならないように聞こえます。その場合、それらのありそうもないものは正しくないので、私はこれを使用します。

if (unlikely(!X))
{
  if (Y)
  {
  ...
  }
  else //Z must be true
  {
   ...
  }
}

(これは宇郷の答えにコメントしただろうが、コメントを残すほどの評判はない。)

于 2012-08-10T10:34:01.953 に答える