7

条件がある場合if-else、計算上、チェックするのに効率的なのは何でしょうか。等しい演算子を使用する等しくない演算子を使用するか。何か違いはありますか?

たとえば、次のどちらが計算効率が高いか、以下の両方のケースで同じことができますが、どちらが優れていますか(違いがある場合)?

ケース1:

if (a == x)
{
    // execute Set1 of statements
}
else
{
    // execute Set2 of statements
}

ケース2:

if (a != x)
{
    // execute Set2 of statements
}
else
{
    // execute Set1 of statements
}

ここでは、ほとんどの場合(たとえば、ケースの90%)の仮定はaに等しくなりxます。どちらも符号なし整数型ですax

4

14 に答える 14

10

通常、どの演算子を使用するかはパフォーマンスには関係ありません。ただし、分岐には、ifステートメントの最も可能性の高い結果が最初に来ることをお勧めします。

于 2012-12-12T12:15:26.533 に答える
10

通常、考慮すべきことは次のとおりです。このコードを書くための最も簡単で明確な方法は何ですか?IMHO、最初のポジティブは最も単純です(!を必要としません)

コードは同じものにコンパイルされる可能性が高いため、パフォーマンスの点では違いはありません。(確かにJIT for Javaではそうすべきです)

Javaの場合、JITはコードを最適化できるため、分岐予測では最も一般的な分岐が優先されます。

于 2012-12-12T12:16:35.020 に答える
8

この単純なケースでは、違いはありません。(と仮定しaて、x基本タイプです)オーバーロードされたクラスタイプであるoperator ==operator !=、異なる可能性がありますが、私はそれについて心配しません。

後続のループの場合:

if ( c1 )   { }
else if ( c2 ) { }
else ...

他の人の無用な評価を防ぐために、最も可能性の高い条件を最初に置く必要があります。(ここでも、1つしかないため、ここでは適用されませんelse)。

于 2012-12-12T12:15:36.260 に答える
5

GCCは、式の予想される結果についてコンパイラーに通知する方法を提供します。

if (__builtin_expect(expression, 1))
…

このビルトインはの値に評価されますがexpression、可能性のある結果が1(trueブール値の場合)であることをコンパイラーに通知します。これを使用するには、expression(人間の場合)できるだけ明確に記述してから、2番目のパラメーターを結果である可能性が最も高い値に設定する必要があります。

于 2012-12-12T13:24:26.660 に答える
4

違いはありません。

x86 CPUアーキテクチャには、条件付きジャンプ用の2つのオペコードがあります

JNE (jump if not equal)
JE (jump if equal)

通常、これらは両方とも同じCPUサイクル数を必要とします。

そして、そうでない場合でも、コンパイラーがそのような些細な最適化を行うことを期待できます。マイクロ秒を気にするのではなく、最も読みやすいものと、意図をより明確にするものを記述します。

于 2012-12-12T12:19:06.310 に答える
4

ある方法で他の方法よりも大幅に効率的であることが証明できるJavaコードを作成できた場合は、結果を公開し、違いが見られた実装に対して問題を提起する必要があります。

もっと重要なことは、この種の質問をするだけで何かがおかしいという兆候であるはずです。それは、コードの間違った側面に注意と努力を集中していることを示しています。実際のアプリケーションのパフォーマンスは、常に不十分なアーキテクチャに悩まされています。このような懸念から決して。

于 2012-12-12T12:29:50.657 に答える
2

初期の最適化はすべての悪の根源です

分岐予測の場合でも、本当に必要になるまではあまり気にしないでください。

ピーターが言ったように、最も簡単な方法を使用してください。

于 2012-12-12T12:19:08.363 に答える
2

コンパイラー/オプティマイザーにその作業を任せます。ソースコードが最も読みやすい方法であなたの意図を表現することは(ほとんどの場合)一般的な経験則です。あなたはそれを別の人間(そしてコンピューターではなく)に書いています。1年後、あなた自身またはあなたのチームメイトはあなたのコードをより少ない労力で理解する必要があります。

于 2012-12-12T12:35:24.403 に答える
1

パフォーマンスの面で違いはありませんが、最も読みやすいものを検討してください。次に、コードを振り返るとき、または誰かがコードを見ている場合は、コードを理解しやすくする必要があります。

于 2012-12-12T12:19:37.907 に答える
0

最初の条件がほとんどの場合に当てはまる条件である場合、(読みやすさの観点から)少し利点があります。あなたがそれらを最もよく読むことができるように条件を書いてください。条件を否定することによって速度の恩恵を受けることはありません

于 2012-12-12T12:17:25.317 に答える
0

ほとんどのプロセッサは、等式/不等式チェックに電気ゲートを使用します。これは、すべてのビットが一度にチェックされることを意味します。したがって、違いはありませんが、コードを本当に最適化したい場合は、自分でベンチマークを行い、結果を確認することをお勧めします。
そのように最適化する価値があるかどうか疑問に思っている場合は、画面のすべてのピクセルに対してこのチェックを複数回行うか、そのようなシナリオを考えてみてください。イムホ、良い習慣を身につけるだけだとしても、最適化することは常に価値があります;)

于 2012-12-12T12:43:14.713 に答える
0

あなたが最初に使用した非負のアプローチだけが最良のようです。

于 2012-12-12T12:51:00.127 に答える
0

確実に知る唯一の方法は、両方のバージョンをコーディングして、それらのパフォーマンスを測定することです。差がわずか1パーセント程度の場合は、意図をより明確に伝えるバージョンを使用してください。

2つの間に大きな違いが見られる可能性はほとんどありません。

于 2012-12-12T12:54:43.760 に答える
0

それらの間のパフォーマンスの違いはごくわずかです。したがって、コードの読みやすさについて考えてみてください。読みやすくするために、Ifステートメントのコード行が多い方が好きです。

if (a == x) { 
    // x lines of code
} else {
    // y lines of code where y < x
}
于 2012-12-12T13:10:54.137 に答える