Wie ist String in switch-Anweisung effizienter als eine entsprechende if-else-Anweisung?
Java-Dokumentation sagt
Erzeugt der Java-compiler im Allgemeinen effizienter bytecode von switch-Anweisungen, die die Verwendung von String-Objekten als von verketteten if-then-else-Anweisungen.
AFAIK auch String in switch verwendet .equals()
intern in einem Fall sensible Art und Weise. Also, was Effizienz bedeuten Sie in diesem Zusammenhang. Schnellere Zusammenstellung? Weniger bytecodes ? bessere Leistung?
- nützlicher link :blackwasp.co.uk/SpeedTestIfElseSwitch.aspx
- BTW, Entschuldigung an alle; ich war offenbar zu schreiben, während einschlafen Letzte Nacht und war nicht nur die Herstellung der Verbindung zu einem hash-basierten dispatch-Tabelle. Ja, das macht Sinn, nicht nur für nicht-ganzzahlige Werte, sondern für weit-Abstand geringer Dichte-Werte. "Vorsicht: Zur Vermeidung von Schäden an der reputation, engagieren Gehirn, bevor Sie die Finger in Gang."
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mithilfe einer switch-Anweisung ist schneller als equals (aber nur merklich, wenn es mehr als nur ein paar strings), da wird zuerst den
hashCode
von der Zeichenfolge, dieswitch
auf, um zu bestimmen, die die Teilmenge der Zeichenfolgen, die möglicherweise übereinstimmen. Wenn mehr als ein string in dem Fall, Etiketten hat den gleichen hashCode, der JVM führen sequenzielle Aufrufeequals
und selbst wenn es nur eine Zeichenfolge im Fall von Etiketten, die einen hashCode, die die JVM braucht, umequals
um zu bestätigen, dass die Zeichenfolge in das case label ist wirklich gleich der in der switch-Ausdruck.Der Laufzeit die Leistung eines Schalter für String-Objekte ist vergleichbar mit einer Suche in einer
HashMap
.Dieses Stück code:
Ist intern kompiliert und ausgeführt, wie dieses Stück code:
(nicht wörtlich, aber wenn Sie zu dekompilieren, beide Stücke von code, die Sie sehen, dass genau die gleiche Abfolge von Aktionen)
In Allgemeinen, switch-Anweisungen sind besser, weil Sie (grob gesagt)
O(1)
, während eine Kette vonif-else
istO(n)
Dass
n
Bedingungen führen könnte, bis zun
Vergleiche, die mit einer verkettetenif-else
Aussagen.Einer switch-Anweisung kann der "Sprung" direkt auf die entsprechende Bedingung (wie eine Landkarte) oder die default-Fall, so dass es
O(1)
.Dies ist ein bytecode-fragment generiert aus dem Beispiel in der Dokumentation:
Verwendung von LOOKUPSWITCH hat bessere perfomance im Vergleich zu if-else-Logik