9

私はJavaプログラムのパフォーマンスを改善することに取り組んでいます。とアルゴリズムの複雑さを改善した後data structures、実装を改善しようとしています。ifステートメントを状態でどのように使用するかが本当に重要かどうかを知りたい.

コンパイラはこれら 2 つのバージョンを同じように扱いますか? ifそれらのコストは同じですか (ステートメント内にもっと多くの変数がある場合)?

if(a && b && c && d && e && f && g)

また

if(a)
 if(b)
  if(c)
   if(d)
    if(e)
     if(f)
      if(g)

この特定のプロジェクトでは、読みやすさはあまり気にしません。2番目のプロジェクトは読みにくいことを知っています

4

3 に答える 3

22

&&演算子 (および||) は、Java の短絡演算子です

つまり、 が である場合a、 Java は、などをfalse評価しません。これは、式全体が になることを既に知っているためです。bcda && b && c && d && e && f && gfalse

ifしたがって、一連のネストされたステートメントとして記述しても何も得られませんif

パフォーマンスを最適化する唯一の良い方法は、プロファイラーを使用してプログラムのパフォーマンスを測定し、実際のパフォーマンスのボトルネックがどこにあるかを判断し、コードのその部分を改善しようとすることです。コードを調べて推測し、マイクロ最適化を適用して最適化することは、通常、最適化の効果的な方法ではありません。

于 2012-11-29T13:16:59.883 に答える
10

他の回答に加えて、非常に低いレベルであっても、2 つのアプローチに違いはありません。これらは同じバイトコードにコンパイルされます。

boolean a=true, b=true, c=true, d=true, e=true, f=true, g=true;
   0: iconst_1
   1: istore_1
   2: iconst_1
   3: istore_2
   4: iconst_1
   5: istore_3
   6: iconst_1
   7: istore        4
   9: iconst_1
  10: istore        5
  12: iconst_1
  13: istore        6
  15: iconst_1
  16: istore        7

if(a && b && c && d && e && f && g) {}
  18: iload_1
  19: ifeq          45
  22: iload_2
  23: ifeq          45
  26: iload_3
  27: ifeq          45
  30: iload         4
  32: ifeq          45
  35: iload         5
  37: ifeq          45
  40: iload         6
  42: ifeq          45

if(a) if(b) if(c) if(d) if(e) if(f) if(g) {}
  45: iload_1
  46: ifeq          72
  49: iload_2
  50: ifeq          72
  53: iload_3
  54: ifeq          72
  57: iload         4
  59: ifeq          72
  62: iload         5
  64: ifeq          72
  67: iload         6
  69: ifeq          72
于 2012-11-29T13:22:34.107 に答える
6

任意の言語で書かれたプログラムをプロファイリングするときは、言語構造に注目するのではなく、コードが何をしているかに注目してください。コードの時間を計り、どこで時間が費やされているかを調べます。そうすれば、原因が絞り込まれているため、何が原因であるかがわかります。

プログラムの遅い部分が if ステートメントにあることがわかっている場合は、質問に対する答えが既にわかっています。

最適化の目的で特定の言語機能の効率について尋ねることは完全に間違ったアプローチであり、はるかに異なる戦略の恩恵を受けると信じているため、これを回答として投稿しています。

また、特定の実装では物事の処理が少し異なる場合があるため、標準で何かが確定されていない限り (そして、それが保証されない場合もあります)、答えは実装に依存し、条件付きになる可能性があります。

于 2012-11-29T13:17:50.887 に答える