2012-04-25 14 views
3

でSTATEMENT、私は技術的なここで疑問にみんなをお持ちの場合は、switch文をより速く実行し、そのことは、私はそれswitch文C++

を知っているが、私が知りたいのは、それがあれば、他&場合よりも速く実行しない方法です?

controlExpressionの適切なケースをすべてのケースで直接見つけることができますか?

もし私がそれを実行して適切なケースを見つけるためにif elseを使って書かれているとすれば、それはより早く実行すべきではありません。

私にお答えできますか? 、var == avar == bvar == cなど

This page has details of how that's translated into assembly by a compilerが、switch文の三つの「種類」基本的にあります:事前

+0

どの言語ですか?コンパイラによって異なる場合もあります。しかし、一般的なアイデアは、効率的にIFを注文することで複製できるオプションにバイナリ検索ツリーを構築しているか、レンジチェックの後にジャンプ・テーブル・ルック・アップを付けて、必要なコードを見つけ出します。ルックアップを使用してインデックスを一般的な実装と組み合わせてからジャンプテーブルをルックアップするなど、実際にはスイッチとifの間に大きな違いはないと言われています。 – Rup

答えて

4

でのおかげでswitch文は基本的にすべてのケースについての比較と同じ種類を実行

は、
  1. switchステートメントは、連続するcaseの整数 - たとえばcase 3: ... case 4: ... case 5: ...です。このような場合、コンパイラはジャンプテーブルを作成することができます。ジャンプテーブルは連続したメモリブロックにジャンプしてオフセットを計算し、アドレスを見つけてジャンプするアドレスのリストです。これは、if-else ifタイプのチェーンより高速です。 (たぶん1つのケースがある場合は少し遅いです。)
  2. switch一見ランダムですcaseの整数 - case 12: ... case 106: ... case 9: ...のようなステートメントです。このような場合、コンパイラはif-else ifチェーンを作成するだけなので、if-else ifタイプのコードより高速にすることはできません。
  3. switch一見ランダムcase整数のたくさんの文は - かなりの数がある場合は、いくつかのコンパイラは例すべてのバイナリ検索ツリーを構築しますので、あなたは、任意の特定のブランチを実行するO(log(n))時間を持って、改善するべきあなたのコードのパフォーマンス。

これは、コンパイラを圧倒することができる状況です(コンパイルするアーキテクチャーによって重要なのは、ツリーのどの枝をフォローするか、またはジャンプする必要があるかどうかを確認するためです)。場合によっては、3x+5のようないくつかのケースでしかケースを一致させることができない場合は、関数ポインタの配列を作成し、インデックス((caseNum - 5)/3)を計算してからContinuation-Passing Styleを実行します。同じ計算をしてgotoラベルの配列を作成し、スパゲッティスタイルでジャンプしてください。いずれの場合でも、分岐時間がO(1)の最適な「連続ケース」スタイルアセンブリを得ることができます。

+0

ありがとうbro :)私は今知識の共有のために多くの感謝を得る –