12

重複の可能性:
Javaでのif / elseとswitchステートメントの相対的なパフォーマンスの違いは何ですか?

次の2つの方法があります。

public static int useSwitch(int i) {
    switch (i) {
    case 0:
        return 1;
    default:
        return 0;
    }
}

public static int useIf(int i) {
    if (i == 0)
        return 1;
    return 0;
}

テストでは、バージョンswitchよりもわずかに高速に実行されることが示されています(私のマシンでは、呼び出しごとに1.4ナノ秒) 。if

私はいつも、スイッチのメリットは、少なくともいくつかifs回避できるようになるまでは効果がないと信じていました。

なぜswitch単一よりも速いのifですか?

4

2 に答える 2

7

バイトコードをチェックすることにより、結果は期待どおりです。

スイッチ

public static useSwitch(I)I
 L0
  ILOAD 0
  TABLESWITCH
    0: L1
    default: L2
 L1
  INVOKESTATIC Tests.a()I
  IRETURN
 L2
  INVOKESTATIC Tests.b()I
  IRETURN

もしも

public static useIf(I)I
 L0
  ILOAD 0
  IFNE L1
 L2
  INVOKESTATIC Tests.a()I
  IRETURN
 L1
  INVOKESTATIC Tests.b()I
  IRETURN

今では、一方が他方よりも遅くなる必要がある特定の理由はわかりません(いずれの場合も大幅な量ではありません)。これは確かに、特定のJVM実装とそれがこれらのオペコードを実行する方法に関連するものです。常識によれば、TABLESWITCHその構築を価値あるものにする十分なケースがない限り、命令は遅くなるはずですが、これは単なる一般的な考え方です。すべてのJVMはそれを異なる方法で実装する可能性があるため、これは単なる推測です。

一貫した方法ですべてをプロファイリングしてよろしいですか?(JVMにウォームアップする時間を与えることによって、結果だけを信頼範囲内に保つことによって、およびプロファイリングを使用するのに十分正確にする他のすべてのものによって)

于 2012-12-30T19:52:09.860 に答える
0

このタイプの比較は、If-elseとswitchで分析されます–どちらが良いですか?。ただし、gcjを使用してネイティブコードにコンパイルし、取得した結果をバイトコードを使用した結果と比較してみてください。

于 2012-12-30T21:33:47.503 に答える