2012-01-13 20 views
0

私はちょうど疑問に思っていた、実際には効率的なコンパイラを使用するには?Javaの方が効率的でしょうか? If-return-elseまたはIf-return?

if (condition) { 
    return something; 
} else { 
    dosomething();  
} 

OR

if (condition) { 
    return something; 
} 
dosomething(); 

は、私は、これらが極めて低い違いがあることを知っているとより読みやすいバージョンが選択されなければならないことが、ちょうど我々は1のようになりた、このコードに10億回を実行するだろうと言うことができますもっと効率的?

「実際の世界」には何の利益もないことも知っていますが、私は興味があります。

+0

複製: http://stackoverflow.com/q/7921359/143897 http://stackoverflow.com/q/1370865/143897 –

+0

@JayD質問が関連しているが、彼らはIFAICSに複製されません。しかし、私は非建設的な質問に投票します... –

+0

この質問は非常にコンパイラの実装の詳細に依存するため、答えが不可能です。さらに、この違いはほとんどないので、これを心配することに時間を費やす価値はない。 – Jesper

答えて

6

ないパフォーマンスの違いで見つけることができます。 bytecodeには、同じデータが同じ順序で同じ命令で処理されています。様々な質問の

L0 
    LINENUMBER 11 L0 
    ICONST_1 
    ISTORE 0 
    L1 
    LINENUMBER 12 L1 
    ILOAD 0 
    IFEQ L2 
    L3 
    LINENUMBER 13 L3 
    GETSTATIC p/A.something : Ljava/lang/Object; 
    ARETURN 
    L2 
    LINENUMBER 15 L2 
    FRAME APPEND [I] 
    INVOKESTATIC p/A.dosomething()V 
    L4 
    LINENUMBER 17 L4 
    ACONST_NULL 
    ARETURN 
    L5 
    LOCALVARIABLE condition Z L1 L5 0 
    MAXSTACK = 1 
    MAXLOCALS = 1 

L0 
    LINENUMBER 7 L0 
    ICONST_1 
    ISTORE 0 
    L1 
    LINENUMBER 8 L1 
    ILOAD 0 
    IFEQ L2 
    L3 
    LINENUMBER 9 L3 
    GETSTATIC p/B.something : Ljava/lang/Object; 
    ARETURN 
    L2 
    LINENUMBER 11 L2 
    FRAME APPEND [I] 
    INVOKESTATIC p/B.dosomething()V 
    L4 
    LINENUMBER 12 L4 
    ACONST_NULL 
    ARETURN 
    L5 
    LOCALVARIABLE condition Z L1 L5 0 
    MAXSTACK = 1 
    MAXLOCALS = 1 

public class A { 
    static Object something = new Object(); 
    public static void main(String[] args) { 
     test(); 
    } 
    private static Object test() { 
     boolean condition = true; 
     if (condition) { 
      return something; 
     } else { 
      dosomething(); 
     } 
     return null; 
    } 
    private static void dosomething() {} 
} 

public class B { 
    static Object something = new Object(); 
    public static void main(String[] args) { 
     test(); 
    } 
    private static Object test() { 
     boolean condition = true; 
     if (condition) { 
      return something; 
     } 
     dosomething(); 
     return null; 
    } 
    private static void dosomething() {} 
} 
1

全く大きな違いはありません。 elseが別の式を評価していないが、元の条件が偽であるかどうかを単に伝えることを考えてください。 Conditionはまだ両方向に評価されます。

実際、異なるコンパイラによって行われる最適化によって、同じバイトコードになる可能性があります。 IDEがJavaバイトコードを表示するための多くのプラグインがあります。

1

利得はごくわずかですが、結果の命令が同一であれば驚くことはありません。

このような小さなパフォーマンスの最適化ではなく、ほとんどの場合、「ぶら下がった果物」に集中するほうがよいでしょう。

読みやすさの面で誤りがあります。常にパフォーマンスのボトルネックが発生していないかどうかを確認してください。

1

私はパフォーマンスに大きな違いがあるとは思っていますが、私は後者を好む傾向があります。後者はインデント地獄につながる可能性があるからです。

このコードを10億回実行しても、doSomething()はほぼ確実に時間の点でif/elseを襲っています。

私は常に読みやすさのために最適化し、問題が発生した場合にのみパフォーマンスを心配しています。

読めないコードは、2つのバージョンが全く違いはありません

2

:-)少し遅いコードよりも、問題のはるかです。純粋に読みやすさの観点からの違いだけがあります。

ファンクションの先頭でチェックが行われ、できるだけ早くリターンが実行されるスタイルを採用すると、2番目が手に入ります。

void foo() 
{ 
    if (condition1) 
     return; 
    if (goo()) 
     return; 
    //... 
} 

それ以外の場合、最初のバージョンではより分かりやすい分岐が得られます。

0

私はそれが単なる個人的な好みだと信じています。

いくつかのより多くの情報の答えは、このquestion

関連する問題