1

ifif else、またはswitch次のようなかなり大きなコード ブロックを使用する場合のトレードオフ (無視できる場合でも) を説明できる人はいますか? int の代わりに String または別の Object を比較している場合、状況は異なりますか? 例はJavaで書かれていますが、一般的な質問として意図されています。

編集

いくつかの回答が述べているように、スイッチはより高速になり、ケースが複数ある場合はおそらく使用する必要があります。ただし、このような長いチェーンの場合、ifvsについては誰もコメントしていません。if elseこの質問に火をつけたのは、ほとんどの場合複数の式が必要なため、スイッチを使用できないこれらのブロックを頻繁に作成しているということです。を除外するのは雑に感じると思いelseますが、実際には必要ないのになぜ含めるのですか?

public String getValueString(int x) {
    if (x == 1) return "one";
    if (x == 2) return "two";
    if (x == 3) return "three";
    if (x == 4) return "four";
    ...
    return null;
}

VS

public String getValueString(int x) {
    if (x == 1) return "one";
    else if (x == 2) return "two";
    else if (x == 3) return "three";
    else if (x == 4) return "four";
    ...
    return null;
}

VS

public String getValueString(int x) {
    switch(x) {
        case 1: return "one";
        case 2: return "two";
        case 3: return "three";
        case 4: return "four";
        ...
    }
    return null;        
}
4

5 に答える 5

7

多くのケースがある場合は、このswitchアプローチが推奨される方法です。その理由は、最初の 2 つは基本的にすべての if ステートメントの線形検索を必要とするためです。したがって、それはO(N)あなたが持っているケースの数になります。

一方、switchステートメントは異なる方法で最適化され、その正しいケースを見つけるために、O(log(N))またはそのどちらかになる可能性があります。O(1)


コンパイラはどのように達成できますO(log(N))O(1)?

  • ケース値のバイナリ検索により、 で実行できるようになりますO(log(N))
  • ケース値が十分に密集している場合、コンパイラはケース変数によってインデックス付けされたジャンプ テーブルを使用することさえあります。その場合は ですO(1)
于 2012-04-17T04:22:16.860 に答える
2

ほとんどのコンパイラは、質問の例をほぼ同じ、またはまったく同じになるように最適化します。したがって、問題は読みやすさの 1 つです。

1 つまたは 2 つのケースがある場合、ifステートメントは通常意味があります。多くの場合、特に各ケースのコードが小さい場合、switchステートメントは必要なコードの点でより経済的になり、読みやすくなる傾向があります。

しかし、少なくともある程度までは、読みやすさは個人の好みの問題です。

于 2012-04-17T04:22:06.247 に答える
2

Switch は、使用できる場合、if/else ブロックよりも高速です。エントリが 5 つを超える場合は、ルックアップとして実装されます。これは、パフォーマンスに関するいくつかの情報を提供します: 「else if」は「switch() ケース」より速いですか?

これらの場合も読みやすいと思います。

于 2012-04-17T04:23:17.453 に答える
1

ifアイテムが少ない場合、ステートメントとステートメントの間でパフォーマンスに大きな違いはありませんswitch。ステートメントではswitch、すべてのアイテムが同時に直接アクセスされるため、最後のアイテムは最初のアイテムと同じ時間がかかります。ステートメントでは、最後のアイテムにアクセスすると、そのif前のすべてのアイテムをトラバースする必要があるため、最初のアイテムよりも時間がかかります。とにかく、例のようにアイテムが少ない場合、レイテンシは目立ちません。

このトピックに関する良い議論があります。見てください。

于 2012-04-17T04:39:36.967 に答える
0

提供された例のような条件が多数ある場合は、マップをお勧めします。

Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"one");
map.put(2,"two");
map.put(3,"three");
map.put(4,"four");

トレードオフについてはわかりません。switch ステートメントと同様に動作すると思います。コードの循環的な複雑さが軽減され、コードが読みやすくなります。

于 2012-04-17T05:16:25.747 に答える