10

if実行される可能性が高いコードをorelse句に入れるべきかどうか、言語に大きなパフォーマンスの違いがあるかどうか疑問に思っていました。次に例を示します。

// x is a random number, or some key code from the user
if(!somespecific_keycode)
   do the general stuff
else
   do specific stuff

そして他の解決策

if(somespecific_keycode)
   do the specific stuff
else
   do general stuff
4

11 に答える 11

9

コードをより明確にする順序で配置することをお勧めします。通常、最初に実行される可能性が高くなります。

于 2012-08-01T16:41:25.097 に答える
7

他の人が言ったように:パフォーマンスの観点から、正しいことを行うには、コンパイラとハードウェア(分岐予測、投機的実行)に頼るのが最善です。

これら2つが十分に役立たないことを本当に心配している場合、GCCは、ブランチの期待される結果を明示的に示すことができる組み込み(__builtin_expect)を提供します。

コードの可読性の観点から、私は個人的に、より可能性の高いケースが一番上にあるのが好きです。

于 2012-08-01T16:42:26.610 に答える
4

パフォーマンスの問題が発生しない限り、心配する必要はありません。

パフォーマンスの問題が発生した場合は、それらを切り替えてみて、どのバリアントが高速かを測定してください。

于 2012-08-01T16:39:45.510 に答える
2

一般的なルールは、より可能性の高いケースを最初に置くことです。これは、より読みやすいと見なされます。

于 2012-08-01T16:40:35.557 に答える
1

これは必ずしもパフォーマンスの問題ではありませんが、私は通常、次のようなケースを防ぐために特定のものから一般的なものに移行します。

int i = 15;

if(i % 3 == 0)
   System.out.println("fizz");
else if(i % 5 == 0)
   System.out.println("buzz");
else if(i % 3 == 0 && i % 5 == 0)
   System.out.println("fizzbuzz");   

i % 3 == 0ここでは、15がとi % 5 == 0条件の両方に一致するため、上記のコードは「fizzbuzz」とは表示されません。より具体的なものに再注文する場合:

int i = 15;

if(i % 3 == 0 && i % 5 == 0)
   System.out.println("fizzbuzz");
else if(i % 3 == 0)
   System.out.println("fizz");
else if(i % 5 == 0)
   System.out.println("buzz");  

これで、上記のコードは、より一般的な条件で停止する前に「fizzbuzz」に到達します

于 2012-08-01T16:43:32.967 に答える
1

分岐予測により、それらのいずれかが発生する可能性が高くなり、ループ内にある場合はパフォーマンスの違いが発生します。しかし、アセンブラ レベルで考えていない場合は、ほとんど無視できます。

于 2012-08-01T16:39:33.040 に答える
0

他の人が言っているように、これを何度も(たとえばループで)使用しない限り、大きな違いはありません。その場合、条件チェックから抜け出す機会が最も早いので、最も可能性の高い条件を最初に置きます。

'else if'sがたくさんあるようになると、より明らかになります。

于 2012-08-01T16:42:15.213 に答える
0

発生する可能性のある違いは、本質的に構造よりもコンテキストに関連していますif-else。したがって、ここでできる最善のことは、違いを検出するための独自のテストを開発することです。

すでに完成しているシステムまたはソフトウェアを最適化する場合を除いて、時期尚早の最適化を避けることをお勧めします。おそらくあなたは彼らが悪であるとすでに聞いたことがあるでしょう。

于 2012-08-01T16:42:29.247 に答える
0

最新の最適化Cコンパイラを使用したAFAIKは、ifまたはループを編成する方法と、生成されたコードの実際の分岐命令との間に直接的な関係はありません。さらに、CPUが異なれば分岐予測アルゴリズムも異なります。

したがって:

  • このコードに関連するパフォーマンスの低下が見られるまで、最適化しないでください

  • 最適化する場合は、さまざまなバージョンを測定して比較します

  • パフォーマンス測定には、さまざまな特性の現実的なデータを使用します

  • どちらの場合も、コンパイラによって生成されたアセンブリコードを確認してください。

于 2012-08-01T16:43:14.487 に答える
0

ほとんどの場合、違いはありませんが、if が何かが true または equal であるかどうかをチェックし、そうでない場合に else が処理する場合は、読みやすくデバッグしやすい場合があります。

于 2012-08-01T16:41:10.323 に答える