web-dev-qa-db-ja.com

ケースとIf Else If:どちらがより効率的ですか?

可能な重複:
「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{

   }
58
Aran Mulholland

コンパイラーは、ifステートメントよりもswitchステートメントの最適化の方が優れているようです。

コンパイラーは、ifステートメントを評価する順序があなたにとって重要であるかどうかを知らず、そこで最適化を実行できません。 ifステートメントでメソッドを呼び出して、変数に影響を与えている可能性があります。 switch-statementを使用すると、すべての句を同時に評価でき、最も効率的な順序で配置できることがわかります。

ここに小さな比較があります:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx

85
Zyphrax

デバッガーは、コンパイラーが作成する実際のコードをステップ実行したくないため、より簡単にしています。

スイッチに5つ以上のアイテムが含まれる場合、ルックアップテーブルまたはハッシュテーブルを使用して実装されます。それ以外の場合は、if..elseを使用して実装されます。

密接に関連する質問を参照してください 「switch()case」よりも「else if」ですか?

もちろん、C#以外の言語では多少異なる方法で実装されますが、一般的にはスイッチの方が効率的です。

9
Guffa

多くのプログラミング言語はswitch文を最適化して、ケースがコンパイラ定数である場合の構造が標準のif-elseよりもはるかに高速になるようにします。多くの言語は、ジャンプステートメントまたはインデックス付き ブランチテーブル を使用してswitchステートメントを最適化します。 Wikipedia にはswitchステートメントに関する適切な議論があります。また、 here は、Cでのスイッチの最適化の説明です。

注意すべきことの1つは、switchステートメントが悪用される可能性があることです。場合によっては、switchステートメントの代わりにポリモーフィズムを使用することをお勧めします。例については here を参照してください。

6
Ryan

ウィキペディアの Switchステートメントエントリ はかなり大きく、実際にはかなり良いです。興味深い点:

  • スイッチは本質的に高速ではありません。言語、コンパイラ、および特定の用途に依存します。
  • コンパイラmayは、ジャンプテーブルまたはインデックス付き関数ポインタを使用してスイッチを最適化します。
  • この声明は Stephen Kleene (およびその他)の興味深い数学に触発されました。

Cスイッチを使用した奇妙で興味深い最適化については、 Duff's Device を参照してください。

0
Corbin March

私はそれがデバッガを単純にしてくれると思う。ケースと「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
0
mlathe

私は、ケースは定数値でなければならないので、switchステートメントはgotoと同等であるため、変数の値に基づいて適切なケースにジャンプしますが、if/thenステートメントでは各式を評価する必要があります。

0
Nate Heinrich

値はコンパイラ定数であるため、caseステートメントに対してこれを行うことができます。詳細な説明はこちら http://sequence-points.blogspot.com/2007/10/why-is-switch-statement-faster-than-if.html

0
mcintyre321