85

ifjavaには、classic:if {} else {}とshorthand:の2種類のステートメントがありますexp ? value1 : value2。一方が他方よりも速いですか、それとも同じですか?

声明:

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

三項演算子:

int x = (expression) ? 1 : 2;
4

6 に答える 6

106

そこには「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が異なるネイティブコードで終わった場合は非常に驚きます。

于 2011-01-16T17:02:11.290 に答える
10

どちらの例もおそらく同一またはほぼ同一のバイトコードにコンパイルされるため、パフォーマンスに違いはありません。

実行速度に違いがあった場合でも、最も慣用的なバージョンを使用する必要があります(これは、単純な条件と2つの単純な部分式に基づいて単一の変数を割り当てるための2番目のバージョンであり、より複雑な操作を行うための最初のバージョンです。または1行に収まらない操作)。

于 2011-01-16T17:00:26.377 に答える
8

これらは同じです。どちらもかなり高速で、通常は約10〜30ナノ秒です。(使用パターンによって異なります)この時間枠はあなたにとって重要ですか?

あなたはあなたが最も明確であると信じていることをするべきです。

于 2011-01-16T17:00:32.537 に答える
4

他のすべての答えに追加するだけです:

2番目の式は、多くの場合、三項/三項演算子/ステートメントと呼ばれます。式を返すので非常に便利です。通常の短いステートメントのコードがより明確になる場合があります。

于 2011-01-16T17:12:50.863 に答える
3

どちらも-それらは同じようにコンパイルされます。

于 2011-01-16T17:00:13.913 に答える
0

三項演算子は、if-else条件よりも高速です。

public class TerinaryTest {
    public static void main(String[] args)
    {
        int j = 2,i = 0;
        Date d1 = new Date();
        for(long l=1;l<100000000;l++)
            if(i==1) j=1;
                else j=0;
        Date d2 = new Date();
        for(long l=1;l<100000000;l++)
            j=i==1?1:0;
        Date d3 = new Date();
        System.out.println("Time for if-else: " + (d2.getTime()-d1.getTime()));
        System.out.println("Time for ternary: " + (d3.getTime()-d2.getTime()));
    }
}

試験結果:

トレイル-1:

if-elseの時間:63

三元時間:31

トレイル-2:

if-elseの時間:78

三元時間:47

トレイル-3:

if-elseの時間:94

三元時間:31

トレイル-4:

if-elseの時間:78

三元時間:47

于 2020-04-28T15:20:02.380 に答える