可能な重複:
「switch()case」よりも「else if」の方が速い?
Javaのif/elseとswitchの相対的なパフォーマンスはどのくらいですか?
もう一度コーディングで実行しました。..デバッガーがcaseステートメントをステップ実行すると、条件に一致するアイテムにすぐにジャンプしますが、if/elseを使用して同じロジックが指定されている場合は、すべてのifステートメントをステップ実行します勝者が見つかるまで。 caseステートメントはより効率的ですか、それともデバッガーは単にステップスルーを最適化していますか? (構文/エラーを心配する必要はありません、SOでこれを入力し、コンパイルするかどうかわからない、その原則は私が求めているものです、私は漠然と何かを覚えているため、intとしてそれらをやりたくありませんでしたintでオフセットを使用する場合)C#を使用しますが、プログラミング言語全体の一般的な答えに興味があります。
switch(myObject.GetType()){
case typeof(Car):
//do something
break;
case typeof(Bike):
//do something
break;
case typeof(Unicycle):
//do something
break;
case default:
break;
}
[〜#〜] vs [〜#〜]
Type myType = myObject.GetType();
if (myType == typeof(Car)){
//do something
}
else if (myType == typeof(Bike)){
//do something
}
else if (myType == typeof(Unicycle)){
//do something
}
else{
}
コンパイラーは、ifステートメントよりもswitchステートメントの最適化の方が優れているようです。
コンパイラーは、ifステートメントを評価する順序があなたにとって重要であるかどうかを知らず、そこで最適化を実行できません。 ifステートメントでメソッドを呼び出して、変数に影響を与えている可能性があります。 switch-statementを使用すると、すべての句を同時に評価でき、最も効率的な順序で配置できることがわかります。
ここに小さな比較があります:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx
デバッガーは、コンパイラーが作成する実際のコードをステップ実行したくないため、より簡単にしています。
スイッチに5つ以上のアイテムが含まれる場合、ルックアップテーブルまたはハッシュテーブルを使用して実装されます。それ以外の場合は、if..elseを使用して実装されます。
密接に関連する質問を参照してください 「switch()case」よりも「else if」ですか? 。
もちろん、C#以外の言語では多少異なる方法で実装されますが、一般的にはスイッチの方が効率的です。
多くのプログラミング言語はswitch文を最適化して、ケースがコンパイラ定数である場合の構造が標準のif-elseよりもはるかに高速になるようにします。多くの言語は、ジャンプステートメントまたはインデックス付き ブランチテーブル を使用してswitchステートメントを最適化します。 Wikipedia にはswitchステートメントに関する適切な議論があります。また、 here は、Cでのスイッチの最適化の説明です。
注意すべきことの1つは、switchステートメントが悪用される可能性があることです。場合によっては、switchステートメントの代わりにポリモーフィズムを使用することをお勧めします。例については here を参照してください。
ウィキペディアの Switchステートメントエントリ はかなり大きく、実際にはかなり良いです。興味深い点:
Cスイッチを使用した奇妙で興味深い最適化については、 Duff's Device を参照してください。
私はそれがデバッガを単純にしてくれると思う。ケースと「ifリスト」は最終的に同じではないことに注意してください。ケースブロック通常が "break"で終わる理由があります。アセンブリで分解すると、ケースstmtは実際には次のようになります。
if myObject.GetType() == type of Car
GOTO START_CAR
else if myObject.GetType() == type of Bike
GOTO START_BIKE
LABEL START_CAR
//do something car
GOTO END
LABEL START_BIKE
//do something bike
GOTO END
LABEL END
休憩がない場合、ケースブロックには「GOTO END」文がありません。実際、「車」ケースに着陸した場合は、実際に両方のセクションを実行します
//do something car
//do something bike
GOTO END
私は、ケースは定数値でなければならないので、switchステートメントはgotoと同等であるため、変数の値に基づいて適切なケースにジャンプしますが、if/thenステートメントでは各式を評価する必要があります。
値はコンパイラ定数であるため、caseステートメントに対してこれを行うことができます。詳細な説明はこちら http://sequence-points.blogspot.com/2007/10/why-is-switch-statement-faster-than-if.html