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)?

748voto

Guffa Punkte 663241

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

Enthält ein Schalter mehr als fünf Elemente, wird er mit Hilfe einer Nachschlagetabelle oder einer Hash-Liste implementiert. Dies bedeutet, dass alle Elemente die gleiche Zugriffszeit erhalten, im Vergleich zu einer Liste von if:s, bei der das letzte Element viel mehr Zeit benötigt, um zu erreichen, da es zuerst alle vorherigen Bedingungen auswerten muss.

190voto

Wedge Punkte 19070

Warum interessiert Sie das?

In 99,99 % der Fälle sollte Ihnen das egal sein.

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

Und wenn Sie sich darum kümmern müssten, dann sollten Sie ein Performance-Profiling für Ihren Code durchführen. In diesem Fall wäre es trivial, den Leistungsunterschied zwischen einem switch-Fall und einem if-else-Block herauszufinden.

編集する。 Um der Klarheit willen: Implementieren Sie das Design, das klarer und besser wartbar ist. Wenn Sie mit einem großen switch-case- oder if-else-Block konfrontiert werden, besteht die Lösung im Allgemeinen darin, Polymorphismus zu verwenden. Finden Sie das Verhalten, das sich ändert, und kapseln Sie es. Ich hatte schon öfter mit riesigem, hässlichem Switch-Case-Code zu tun, und im Allgemeinen ist es gar nicht so schwierig, ihn zu vereinfachen. Aber es ist sehr befriedigend.

35voto

Michael Klement Punkte 3306

Glaube diese Leistungsbewertung ist der Schalterfall schneller.

Dies ist die Schlussfolgerung:

Die Ergebnisse zeigen, dass die switch-Anweisung schneller ausgeführt werden kann als der if-else-if-Leiter. Dies ist auf die Fähigkeit des Compilers zurückzuführen, die switch-Anweisung zu optimieren. Im Falle der if-else-if-Ladder muss der Code jede if-Anweisung in der vom Programmierer festgelegten Reihenfolge verarbeiten. Da jedoch jeder Fall innerhalb einer switch-Anweisung nicht von früheren Fällen abhängt, ist der Compiler in der Lage, die Tests so anzuordnen, dass die schnellste Ausführung gewährleistet ist.

18voto

Vilx- Punkte 100739

Eine weitere Überlegung: Ist dies wirklich der Engpass Ihrer Anwendung? Es gibt extrem seltene Fälle, in denen eine Optimierung dieser Art wirklich erforderlich ist. In den meisten Fällen können Sie die Geschwindigkeit deutlich erhöhen, indem Sie Ihre Algorithmen und Datenstrukturen überdenken.

12voto

Steven Punkte 3788

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

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