426 Stimmen

Ist "else if" schneller als "switch() case"?

Ich bin ein ehemaliger Pascal-Typ und lerne derzeit C#. Meine Frage ist die folgende:

Ist der folgende Code schneller als ein Wechsel?

int a = 5;

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

Und der Schalter:

int a = 5;

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

    case 2:
        ...
        break;

    case 3:
        ...
        break;

    case 4:
        ...
        break;

    default:
        ...
        break;

}

Welche ist schneller?

Ich frage deshalb, weil mein Programm eine ähnliche Struktur hat (viele, viele "else if"-Anweisungen). Sollte ich sie in Schalter umwandeln?

89 Stimmen

Ich fühle mich gezwungen, darauf hinzuweisen, dass Sie die Polymorphie in Ihren Entwürfen möglicherweise nicht ausreichend nutzen, wenn Ihr Code viele dieser Strukturen enthält.

5 Stimmen

4 Stimmen

Switch ist zwar schneller, aber wenn man nicht gerade eine enge Schleife hyperoptimiert, bedeutet das gar nichts. Was sind 37 Nanosekunden gegenüber 42 Nanosekunden (erfundene Zahlen)?

5voto

annakata Punkte 72408

Viel wichtiger als die Leistungsvorteile von Switch (die zwar relativ gering sind, aber dennoch erwähnenswert) sind die Probleme der Lesbarkeit.

Ich für meinen Teil finde eine switch-Anweisung extrem klar in der Absicht und reinen Leerraum, im Vergleich zu Ketten von ifs.

4voto

AnnaR Punkte 3136

Kurze Antwort: Die Switch-Anweisung ist schneller

Bei der if-Anweisung benötigen Sie (bei Ausführung Ihres Beispielcodes) im Durchschnitt zwei Vergleiche, um zur richtigen Klausel zu gelangen.

Bei der Switch-Anweisung ist die durchschnittliche Anzahl der Vergleiche gleich eins, unabhängig davon, wie viele verschiedene Fälle Sie haben. Der Compiler/VM hat zur Kompilierungszeit eine "Nachschlagetabelle" der möglichen Optionen erstellt.

Können virtuelle Maschinen die if-Anweisung auf ähnliche Weise optimieren, wenn Sie diesen Code häufig ausführen?

2voto

mqp Punkte 66863

Da die switch die gleiche Absicht zum Ausdruck bringt wie Ihre if / else Kette, aber in einer eingeschränkteren, formaleren Weise, sollte Ihre erste Vermutung sein, dass der Compiler in der Lage sein wird, sie besser zu optimieren, da er mehr Schlüsse über die Bedingungen ziehen kann, die an Ihren Code gestellt werden (d.h. nur ein Zustand kann möglicherweise wahr sein, der zu vergleichende Wert ist ein primitiver Typ usw.) Dies ist eine ziemlich sichere allgemeine Wahrheit, wenn Sie zwei ähnliche Sprachstrukturen hinsichtlich der Laufzeitleistung vergleichen.

2voto

User42590 Punkte 2477

Voir http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.switch%28VS.71%29.aspx

switch-Anweisung im Grunde ein Look-up-Tabelle haben es Optionen, die bekannt sind und wenn Anweisung ist wie booleschen Typ. nach mir Schalter und if-else sind gleich, aber für Logik Schalter kann mehr besser helfen. während if-else hilft, im Lesen auch zu verstehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X