ほとんどのコンパイラは、ヒューリスティック (経験に基づく手法) と近似に依存する最適化アルゴリズムを使用してコードを最適化します。以下のコードは、制御フロー分析に入ります。プログラムのサンプルをたくさん実行しました
ケース A) 最終変数を使用した if-else - コンパイラは警告デッド コードをスローします。生成されたバイト コードには、if-else ステートメントはありません。
public static void main(java.lang.String[])
Stack=1, Locals=2, Args_size=1
0: iconst_0
1: istore_1
2: return
LineNumberTable:
line 42: 0
line 54: 2
LocalVariableTable:
Start Length Slot Name Signature
0 3 0 args [Ljava/lang/String;
2 1 1 selection I
}
ケース B) 最終変数のない if-else - コンパイラ エラーはありませんが、コードの最適化もありません。
final int selection i=100; //case A
//int selection i=100; //case B
if(selection==1){
System.out.println("Hi");
}else if(selection==2){
}else{
}
ケース C) if-else は final 変数ですが、if-else ステートメントは別のメソッドに入れられます。
computeIfLese(int selection)
- このメソッドは、パラメーターの値が異なる他のインスタンスによって呼び出される可能性があるため、コード OPtimization は実行されません (明らかに)。
コンパイラーの最適化手法はヒューリスティックスに基づいているため、このケースはミスとして存在する可能性がありますが、最もまれなケースのうち最もまれなケースを誰が考えるでしょうか。
Java Gods からのコメントが待っていました... :)
これは、コンパイラがこれを最適化していないことを示す生きた証拠です。ラベル 5 を確認してください。
public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: bipush 100
2: istore_1
3: bipush 100
5: lookupswitch{ //2
200: 32;
300: 40;
default: 48 }
32: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;
35: ldc #22; //String 200
37: invokevirtual #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
40: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;
43: ldc #30; //String 300
45: invokevirtual #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
48: return
LineNumberTable:
line 11: 0
line 15: 3
line 17: 32
line 18: 40
line 21: 48
LocalVariableTable:
Start Length Slot Name Signature
0 49 0 args [Ljava/lang/String;
3 46 1 selection I
StackMapTable: number_of_entries = 3
frame_type = 252 /* append */
offset_delta = 32
locals = [ int ]
frame_type = 7 /* same */
frame_type = 7 /* same */
}