it-swarm.com.de

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

Mögliches Duplikat:
Gibt es einen signifikanten Unterschied zwischen if/else und switch-case in C #?

Ich bin ein ehemaliger Pascal und lerne gerade C #. Meine Frage lautet wie folgt:

Ist der Code darunter 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;


}

Welches ist schneller?

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

337
Ivan Prodanov

Bei nur wenigen Artikeln ist der Unterschied gering. Wenn Sie viele Artikel haben, sollten Sie auf jeden Fall einen Schalter verwenden.

Wenn ein Switch mehr als fünf Elemente enthält, wird er mithilfe einer Nachschlagetabelle oder einer Hash-Liste implementiert. Dies bedeutet, dass alle Elemente die gleiche Zugriffszeit erhalten, verglichen mit einer Liste von if: s, bei denen das letzte Element viel mehr Zeit zum Erreichen benötigt, da es jede vorherige Bedingung zuerst auswerten muss.

565
Guffa

Warum kümmert dich das?

In 99,99% der Fälle sollte es Sie nicht interessieren.

Es ist unwahrscheinlich, dass diese Art von Mikrooptimierungen die Leistung Ihres Codes beeinträchtigt.

Wenn Sie sich darum kümmern MÜSSEN, sollten Sie Leistungsprofile für Ihren Code erstellen. In diesem Fall wäre es trivial, den Leistungsunterschied zwischen einem Schaltergehäuse und einem if-else-Block herauszufinden.

Edit: Der Übersichtlichkeit halber: Implementieren Sie das Design, das übersichtlicher und wartbarer ist. Im Allgemeinen besteht die Lösung in der Verwendung von Polymorphismus, wenn ein großes Schaltergehäuse oder ein If-else-Block vorliegt. Finden Sie das Verhalten, das sich ändert, und kapseln Sie es ein. Ich musste mich schon einmal mit so einem riesigen, hässlichen Code auseinandersetzen, und im Allgemeinen ist es nicht so schwer zu vereinfachen. Aber ach so befriedigend.

167
Wedge

Glaube diese Leistungsbewertung , ist der Schalterfall schneller.

Dies ist die Schlussfolgerung:

Die Ergebnisse zeigen, dass die switch-Anweisung schneller ausgeführt werden kann als die if-else-if-Anweisung. Dies liegt an der Fähigkeit des Compilers, die switch-Anweisung zu optimieren. Im Fall der If-else-If-Leiter muss der Code jede If-Anweisung in der vom Programmierer festgelegten Reihenfolge verarbeiten. Da sich jedoch jeder Fall innerhalb einer switch-Anweisung nicht auf frühere Fälle stützt, kann der Compiler die Tests so neu anordnen, dass die schnellste Ausführung erzielt wird.

27
Michael Klement

Noch etwas zu beachten: Ist dies wirklich der Engpass in Ihrer Anwendung? Es gibt äußerst seltene Fälle, in denen eine Optimierung dieser Art wirklich erforderlich ist. Meistens können Sie die Geschwindigkeit deutlich verbessern, indem Sie Ihre Algorithmen und Datenstrukturen überdenken.

14
Vilx-

Ich würde sagen, der Wechsel ist der richtige Weg, er ist sowohl schneller als auch besser.

Es gibt verschiedene Links wie ( http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx ), die Vergleichstests der beiden zeigen.

8
Shaun Bohannon

Sollte nicht schwer zu testen sein, erstellen Sie eine Funktion, die zwischen 5 Zahlen umschaltet oder wechselt, werfen Sie einen Rand (1,5) in diese Funktion und wiederholen Sie die Schleife einige Male, während Sie das Timing durchführen.

7
Ólafur Waage

Der Wechsel ist im Allgemeinen schneller als eine lange Liste von ifs, da der Compiler eine Sprungtabelle generieren kann. Je länger die Liste, desto besser ist eine switch-Anweisung über eine Reihe von if-Anweisungen verteilt.

6
Steven

Ich bin nicht sicher, aber ich glaube, die Geschwindigkeit der einen oder anderen Änderung hängt von der verwendeten Programmiersprache ab.

Normalerweise bevorzuge ich Schalter. Auf diese Weise ist der Code einfach zu lesen.

5
user308693

Technisch liefern sie genau das gleiche Ergebnis, sodass sie auf die gleiche Weise optimiert werden sollten. Es gibt jedoch mehr Chancen, dass der Compiler den Switch-Fall mit einer Sprungtabelle optimiert als mit ifs.

Ich spreche hier über den allgemeinen Fall. Bei 5 Einträgen sollte die durchschnittliche Anzahl der durchgeführten Tests für das Wenn weniger als 2,5 betragen, vorausgesetzt, Sie ordnen die Bedingungen nach Häufigkeit. Kaum ein Engpass, über den man nach Hause schreiben kann, außer in einer sehr engen Schleife.

5
jfclavette

Weitaus wichtiger als die Leistungsvorteile von Switches (die relativ gering, aber bemerkenswert sind) sind die Lesbarkeitsprobleme.

Ich finde eine switch-Anweisung extrem klar in Absicht und reinem Leerzeichen im Vergleich zu Wenn-Ketten.

5
annakata

switch wird normalerweise vom Compiler in eine Nachschlagetabelle übersetzt, wenn dies möglich ist. Das Nachschlagen eines beliebigen Falls ist also O (1), anstatt tatsächlich ein paar Fallvergleiche durchzuführen, bevor Sie den gewünschten finden.

Also in vielen Fällen ein if/else if Kette wird langsamer sein. Abhängig von der Häufigkeit, mit der Ihre Fälle betroffen sind, spielt dies jedoch möglicherweise keine Rolle.

4
Joey

Kurze Antwort: Switch-Anweisung ist schneller

Mit der if-Anweisung benötigen Sie durchschnittlich zwei Vergleiche (wenn Sie Ihren Beispielcode ausführen), um zur richtigen Klausel zu gelangen.

Die switch-Anweisung gibt die durchschnittliche Anzahl der Vergleiche an, unabhängig davon, wie viele verschiedene Fälle vorliegen. Der Compiler/die VM hat zum Zeitpunkt der Kompilierung eine "Nachschlagetabelle" möglicher Optionen erstellt.

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

3
AnnaR

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

die switch-Anweisung ist im Grunde genommen eine Nachschlagetabelle und verfügt über Optionen, die bekannt sind. Die if-Anweisung entspricht dem booleschen Typ. laut mir sind switch und if-else gleich aber für logic switch kann man besser mehr helfen. während if-else hilft beim lesen auch zu verstehen.

2
User42590

Da die switch -Anweisung dieselbe Absicht wie Ihre if/else-Kette ausdrückt, jedoch in eingeschränkterer, formaler Weise, sollten Sie zunächst davon ausgehen, dass der Compiler dies kann Optimieren Sie es besser, da es mehr Rückschlüsse auf die Bedingungen Ihres Codes zulässt (dh, es kann möglicherweise nur ein Zustand zutreffen, der zu vergleichende Wert ist ein primitiver Typ usw.). Dies ist eine ziemlich sichere allgemeine Wahrheit, wenn Sie vergleichen zwei ähnliche Sprachstrukturen für die Laufzeitleistung.

2
mqp