1. ホーム
  2. java

[解決済み] if "の構成は、文と三項演算子のどちらが速いか?

2023-06-01 16:47:01

質問

の2種類があります。 if ステートメントがあります。 if {} else {} と略記します。 exp ? value1 : value2 . 一方は他方より速いのでしょうか、それとも同じなのでしょうか?

の文があります。

int x;
if (expression) {
  x = 1;
} else {
  x = 2;
}

三項演算子です。

int x = (expression) ? 1 : 2;

どのように解決するのですか?

そこには、"if"文の1つのタイプしかありません。もう 1 つは条件式です。どちらがより良いパフォーマンスを発揮するかについては、同じバイトコードにコンパイルすることができ、同じように動作すると予想されますが、パフォーマンスの面でどちらかを選択したいとは絶対に思わないほど近いです。

時々 if 文の方が読みやすい場合もあれば、条件演算子の方が読みやすい場合もあります。特に、2つのオペランドが単純で副作用がない場合は条件演算子を使うことをお勧めします。一方、2つの分岐の主目的である である場合は、おそらく if ステートメントを使うでしょう。

以下はサンプルプログラムとバイトコードです。

public class Test {
    public static void main(String[] args) {
        int x;
        if (args.length > 0) {
            x = 1;
        } else {
            x = 2;
        }
    }

    public static void main2(String[] args) {
        int x = (args.length > 0) ? 1 : 2;
    }
}

でデコンパイルしたバイトコード javap -c Test :

public class Test extends java.lang.Object {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1
       4: return

  public static void main(java.lang.String[]
    Code:
       0: aload_0
       1: arraylength
       2: ifle          10
       5: iconst_1
       6: istore_1
       7: goto          12
      10: iconst_2
      11: istore_1
      12: return

  public static void main2(java.lang.String[
    Code:
       0: aload_0
       1: arraylength
       2: ifle          9
       5: iconst_1
       6: goto          10
       9: iconst_2
      10: istore_1
      11: return
}

ご覧のように、このページには わずか バイトコードに違いがあります。 istore_1 が発生するかどうかですが、JITter が異なるネイティブ コードで終了した場合、私は非常に驚かなければなりません。