Java バイト コード レベルでは、単純な if ステートメント (例 1) と通常の if ステートメント (例 2) に違いはありますか?
例 1:
if (cond) statement;
例 2:
if (cond) {
statement;
}
質問の背景は、中括弧のないバリアントのみのようjava.awt.Rectangle
な「高性能」クラスで見たことです。Point
速度の利点はありますか、それともコード スタイルだけですか?
Java バイト コード レベルでは、単純な if ステートメント (例 1) と通常の if ステートメント (例 2) に違いはありますか?
例 1:
if (cond) statement;
例 2:
if (cond) {
statement;
}
質問の背景は、中括弧のないバリアントのみのようjava.awt.Rectangle
な「高性能」クラスで見たことです。Point
速度の利点はありますか、それともコード スタイルだけですか?
コードの保守性は別として、パフォーマンスに関してはまったく同じです。それ自体は命令ではないため{}
、を削除しても速度は向上しません。{}
私は通常{}
、コードを読みやすく (IMO) し、エラーを起こしにくくするために使用します。
この例:
public void A(int i) {
if (i > 10) {
System.out.println("i");
}
}
public void B(int i) {
if (i > 10)
System.out.println("i");
}
生成されたバイトコード:
// Method descriptor #15 (I)V
// Stack: 2, Locals: 2
public void A(int i);
0 iload_1 [i]
1 bipush 10
3 if_icmple 14
6 getstatic java.lang.System.out : java.io.PrintStream [16]
9 ldc <String "i"> [22]
11 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]
14 return
Line numbers:
[pc: 0, line: 5]
[pc: 6, line: 6]
[pc: 14, line: 8]
Local variable table:
[pc: 0, pc: 15] local: this index: 0 type: program.TestClass
[pc: 0, pc: 15] local: i index: 1 type: int
Stack map table: number of frames 1
[pc: 14, same]
// Method descriptor #15 (I)V
// Stack: 2, Locals: 2
public void B(int i);
0 iload_1 [i]
1 bipush 10
3 if_icmple 14
6 getstatic java.lang.System.out : java.io.PrintStream [16]
9 ldc <String "i"> [22]
11 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]
14 return
Line numbers:
[pc: 0, line: 11]
[pc: 6, line: 12]
[pc: 14, line: 13]
Local variable table:
[pc: 0, pc: 15] local: this index: 0 type: program.TestClass
[pc: 0, pc: 15] local: i index: 1 type: int
Stack map table: number of frames 1
[pc: 14, same]
ご覧のとおり、同じです。
2つはまったく同じです。Java コンパイルは同じコードを生成します。
ただし、括弧のないケースでは、括弧の場合のように if ブロック内に複数のサブステートメントを追加することはできないことに注意してください。
あなたが与えた2つの例はまったく同じことをします。最初の例は単純なif-thenステートメントですが、2番目の例は通常のif-thenステートメントです。
中括弧は命令ではなく、したがって速度に影響を与えないため、これら2つのステートメントの実行にかかる時間は同じです。ただし、通常のifステートメントを使用するので、ifステートメント内に必要な数のステートメントを含めることができます。