2012-11-29 8 views
7

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

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

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

OR

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

私は本当に読みやすさを気にしない。この特定のプロジェクトでは、私は2番目の読みにくくている知っているが)

+1

あなたはコンパイラの最適化の問題に取得する前にも、 2番目のバージョンは間違いなく読みにくいです。 – adarshr

+0

あなたは正しいですが、この特定のプロジェクトでは読みやすさについてはあまり気にしませんが、この場合は非常に重要なので、より効率的な実装を使用したいだけです。 – Maroun

+0

これを見てください[回答](http://stackoverflow.com/questions/13621324/are-variable-definitions-that-are-used-once-optimized/13621403#13621403)。それはあなたのケースに転送することができます。 – jlordo

答えて

22

&&演算子(とまた、||)は、Javaの短絡回路です。 afalseであれば、それはすでに式全体a && b && c && d && e && f && gfalseになるだろう知っているので、Javaは、bcdなどを評価していないことを意味

したがって、ifを一連のネストされたifステートメントとして書き込むことはできません。

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

+0

'||'を意味しましたか? 'a'が' true'の場合、Javaは 'a && b && c && d && e && f && g1'を評価し続けます。 'a'が' false'なら 'a && b && c && d && e && f && g1'はfalseとなります。 –

+0

@TheCatが編集されました。 – Jesper

6

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

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

私は、最適化の目的で特定の言語機能の効率性について質問することはまったく間違ったアプローチであると考えているので、これを回答として投稿しています。

また、一部の実装では多少の違いがあるため、標準で何かが設定されていない場合(場合によっては保証されない場合もあります)、その答えは実装に依存し、条件付きになる可能性があります。他の回答に加えて

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