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

10voto

Shaun Bohannon Punkte 491

Ich würde sagen, dass der Wechsel der richtige Weg ist, denn er ist sowohl schneller als auch besser für die Praxis.

Hier ist ein Link die Benchmark-Tests zum Vergleich der beiden zeigt.

8voto

Ólafur Waage Punkte 66497

Sollte nicht schwer zu testen, erstellen Sie eine Funktion, die Schalter oder ifelse's zwischen 5 Zahlen, werfen eine rand(1,5) in dieser Funktion und Schleife, die ein paar Mal während Timing es.

6voto

jfclavette Punkte 3417

Technisch gesehen erzeugen sie genau das gleiche Ergebnis, so dass sie auf ziemlich die gleiche Weise optimiert werden sollten. Es besteht jedoch eine größere Wahrscheinlichkeit, dass der Compiler den switch-Fall mit einer Sprungtabelle optimiert als die ifs.

Ich spreche hier über den allgemeinen Fall. Bei 5 Einträgen sollte die durchschnittliche Anzahl der für die ifs durchgeführten Tests weniger als 2,5 betragen, wenn man die Bedingungen nach Häufigkeit ordnet. Das ist kein nennenswerter Engpass, es sei denn, es handelt sich um eine sehr enge Schleife.

6voto

Joey Punkte 329386

switch wird in der Regel vom Compiler in eine Nachschlagetabelle übersetzt, sofern dies möglich ist. Die Suche nach einem beliebigen Fall ist also O(1), anstatt einige Fallvergleiche durchzuführen, bevor der gewünschte Fall gefunden wird.

Daher wird in vielen Fällen ein if / else if Kette wird langsamer sein. Je nach der Häufigkeit, mit der Ihre Fälle angegriffen werden, macht das aber möglicherweise keinen Unterschied.

6voto

user308693 Punkte 59

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

Ich bevorzuge normalerweise den Schalter. Auf diese Weise ist der Code einfacher zu lesen.

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