web-dev-qa-db-ja.com

"else if"は "switch()case"より速いですか?

可能な重複:
C#でif/elseとswitch-caseを使用することに大きな違いはありますか?

私は現在C#を学んでいる、元Pascalの男です。私の質問は次のとおりです。

以下のコードは切り替えを行うよりも速いですか?

int a = 5;

if (a == 1)
{
    ....
}
else if(a == 2)
{
    ....
}
else if(a == 3)
{
    ....
}
else if(a == 4)
{
    ....
}
else
    ....

そしてスイッチ:

int a = 5;

switch(a)
{
    case 1:
        ...
        break;

    case 2:
        ...
        break;

    case 3:
        ...
        break;

    case 4:
        ...
        break;

    default:
        ...
        break;


}

どちらが速いですか?

私のプログラムは似たような構造をしているので、私は質問しています。それらをスイッチに変えるべきですか?

329
Ivan Prodanov

ほんの少しの項目では、違いはわずかです。あなたが多くのアイテムを持っているなら、あなたは間違いなくスイッチを使うべきです。

スイッチに5つ以上の項目が含まれている場合は、ルックアップテーブルまたはハッシュリストを使用して実装されています。これは、if:sのリストと比較して、すべての項目が同じアクセス時間を取得することを意味します。

549
Guffa

なんで気にするの?

99.99%の時間、あなたは気にするべきではありません。

この種のマイクロ最適化は、コードのパフォーマンスに影響を与えることはほとんどありません。

また、気にする必要がある場合は、コードのパフォーマンスプロファイリングを行う必要があります。その場合、switchケースとif-elseブロックのパフォーマンスの違いを見つけるのは簡単です。

編集:わかりやすくするために、より明確で保守性の高いデザインを使用してください。一般的に巨大なswitch-caseやif-elseブロックに直面したときの解決策は多態性を使うことです。変化している動作を見つけてカプセル化します。私は以前、このような巨大で見苦しいスイッチケースコードを扱わなければなりませんでしたが、一般的に単純化するのはそれほど難しくありません。しかし、ああとても満足。

161
Wedge

この性能評価 を信じて、スイッチケースは速いです。

これが結論です。

結果は、switchステートメントがif-else-ifラダーより実行が速いことを示しています。これは、switchステートメントを最適化するコンパイラの機能によるものです。 if-else-ifラダーの場合、コードはプログラマーによって決定された順序で各ifステートメントを処理しなければなりません。ただし、switchステートメント内の各ケースは以前のケースに依存しないため、コンパイラーは最速の実行を提供するようにテストを並べ替えることができます。

26
Michael Klement

考慮すべきもう一つのこと:これは本当にあなたのアプリケーションのボトルネックですか?この種の最適化が本当に必要な場合は非常にまれです。ほとんどの場合、アルゴリズムとデータ構造を見直すことで、はるかに高速化することができます。

13
Vilx-

私はスイッチが進むべき道だと思うでしょう、それはより速くそしてより良い習慣です。

2つを比較するベンチマークテストを示す( http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx )のようなさまざまなリンクがあります。

8
Shaun Bohannon

テストするのは難しくありません、5つの数字の間で切り替えるか、あるいはそのようなものでない関数を作成し、その関数にRand(1,5)を投入し、それをタイミングを合わせながら数回ループします。

7
Ólafur Waage

コンパイラはジャンプテーブルを生成できるので、一般にswitchはifの長いリストよりも高速です。リストが長いほど、switchステートメントは一連のifステートメントよりも優れています。

6
Steven

よくわかりませんが、使用しているプログラミング言語に応じていずれかの速度が変わると思います。

私は通常switchを使うのを好みます。そうすればコードは読みやすくなります。

5
user308693

技術的には、まったく同じ結果が得られるため、ほぼ同じ方法で最適化できるはずです。ただし、コンパイラがジャンプテーブルを使用してスイッチケースを最適化する可能性は、ifsよりも多くあります。

私はここで一般的な事件について話しています。 5項目の場合、頻度で条件を指定すると仮定すると、ifに対して実行されるテストの平均数は2.5未満になるはずです。非常にタイトなループでない限り、家に書くためのボトルネックはほとんどありません。

5
jfclavette

Switchのパフォーマンス上の利点(比較的わずかですが注目に値する)よりもはるかに重要なのは、読みやすさの問題です。

私は、if文の連鎖と比較して、意図と純粋な空白で非常に明確なswitch文を見つけます。

5
annakata

switchは通常、可能であれば、コンパイラによってルックアップテーブルに変換されます。だから、あなたが欲しいものを見つける前に実際にいくつかのケース比較をする代わりに、任意のケースの検索はO(1)です。

そのため、多くの場合、if/else ifチェーンは遅くなります。あなたの訴訟が発生している頻度によっては、違いはないかもしれません。

4
Joey

簡単な答え:Switch文のほうが速い

If文は、正しい節にたどり着くために、平均して2つの比較が必要です(サンプルコードを実行するとき)。

Switchステートメントには、平均的な比較数がいくつあるかにかかわらず1つになります。コンパイラ/ VMはコンパイル時に可能なオプションの "ルックアップテーブル"を作成しているでしょう。

このコードを頻繁に実行する場合、仮想マシンはifステートメントを同様の方法で最適化できますか?

3
AnnaR

http://msdn.Microsoft.com/ja-jp/library/system.reflection.emit.opcodes.switch%28VS.71%29.aspx を参照してください。

switch文は基本的にルックアップテーブルであり、既知のオプションがあり、if文はブール型のようなものです。私によると、switchとif-elseは同じですが、論理スイッチではより効果的です。 if-elseは読むことでも理解するのに役立ちます。

2
User42590

switchステートメントはあなたのif/elseチェーンと同じ意図を表現していますが、より制限された正式な方法で表現されているので、最初に考えられるのは、コンパイラが最適化できることですあなたのコード(すなわち、1つの状態だけが真である可能性があり、比較される値はプリミティブ型などです)。これはランタイムパフォーマンスのために2つの類似した言語構造を比較するときかなり安全な一般的真実です。

2
mqp