6

Java バイト コード レベルでは、単純な if ステートメント (例 1) と通常の if ステートメント (例 2) に違いはありますか?

例 1:

if (cond) statement;

例 2:

if (cond) {
    statement;
}

質問の背景は、中括弧のないバリアントのみのようjava.awt.Rectangleな「高性能」クラスで見たことです。Point

速度の利点はありますか、それともコード スタイルだけですか?

4

3 に答える 3

10

コードの保守性は別として、パフォーマンスに関してはまったく同じです。それ自体は命令ではないため{}、を削除しても速度は向上しません。{}

私は通常{}、コードを読みやすく (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]

ご覧のとおり、同じです。

于 2013-02-10T20:42:59.477 に答える
5

2つはまったく同じです。Java コンパイルは同じコードを生成します。

ただし、括弧のないケースでは、括弧の場合のように if ブロック内に複数のサブステートメントを追加することはできないことに注意してください。

于 2013-02-10T20:22:22.907 に答える
2

あなたが与えた2つの例はまったく同じことをします。最初の例は単純なif-thenステートメントですが、2番目の例は通常のif-thenステートメントです。

中括弧は命令ではなく、したがって速度に影響を与えないため、これら2つのステートメントの実行にかかる時間は同じです。ただし、通常のifステートメントを使用するので、ifステートメント内に必要な数のステートメントを含めることができます。

于 2013-02-10T20:26:23.977 に答える