Javascript switch vs. if ... else if ... else
Jungs, ich habe ein paar Fragen:
- Gibt es einen Leistungsunterschied in JavaScript zwischen einer
switch
- Anweisung und eineif...else
? - Wenn ja, warum?
- Ist das Verhalten der
switch
undif...else
verschiedenen Browsern? (FireFox, IE, Chrome, Opera, Safari)
Den Grund für diese Frage ist es scheint, dass ich erhalten bessere performance auf eine switch
- Anweisung mit ca 1000 Fälle in Firefox.
Bearbeitet
Unfortuantly das ist nicht mein code, der Javascript erzeugt wird serverseitig aus einer kompilierten Bibliothek und ich habe keinen Zugriff auf den code. Die Methode, die der javascript aufgerufen wird
CreateConditionals(string name, string arrayofvalues, string arrayofActions)
Hinweis arrayofvalues
ist eine durch Kommas getrennte Liste.
dem, was es produziert, ist
function [name] (value) {
if (value == [value from array index x]) {
[action from array index x]
}
}
Hinweis: [name]
= der name ging in die serverseitige Funktion
Nun wechselte ich die Ausgabe der Funktion eingefügt werden, in einer TextArea, schrieb einige JavaScript-code zu analysieren, die durch die Funktion und konvertiert es zu einer Reihe von case
Aussagen.
endlich habe ich die Funktion ausgeführt und es läuft gut, aber die Leistung unterscheidet sich im IE und Firefox.
InformationsquelleAutor der Frage John Hartsock | 2010-05-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beantwortung in Allgemeinheiten:
Testgelände
InformationsquelleAutor der Antwort Tommy
Manchmal ist es besser weder. Zum Beispiel, im "Versand" - situation, Javascript lässt Sie Dinge tun in eine völlig andere Weise:
Einrichten von multi-Weg-Verzweigung, indem Sie ein Objekt erstellen hat viele Vorteile. Sie können hinzufügen und entfernen von Funktionalität dynamisch. Können Sie erstellen, die dispatch-Tabelle von Daten. Sie können prüfen, die Sie programmgesteuert. Sie können beim Aufbau der Handler mit anderen Funktionen.
Gibt es den zusätzlichen overhead eines Funktionsaufrufs zu erhalten, um das äquivalent von einem "Fall", aber der Vorteil (wenn es gibt viele Fälle) von einer hash-lookup zu finden der Funktion für eine bestimmte Taste.
InformationsquelleAutor der Antwort Pointy
Den Unterschied in der Leistung zwischen einem
switch
undif...else if...else
klein ist, ist Sie im Grunde die gleiche Arbeit tun. Ein Unterschied zwischen Ihnen ist, dass kann einen Unterschied machen, ist, dass die expression zu testen, wird nur einmal ausgewertet, die in einemswitch
während es berechnet für jedeif
. Wenn er teuer ist, um den Ausdruck auszuwerten, tut es eine Zeit ist natürlich schneller als wenn man es hundert mal.Den Unterschied in der Umsetzung der Befehle (und alle Skripts im Allgemeinen) unterscheidet sich ganz ein bisschen zwischen den Browsern. Es ist üblich, um zu sehen, relativ großen performance-Unterschiede für den gleichen code in verschiedenen Browsern.
Da kann man kaum performance-test der gesamte code in allen Browsern, sollten Sie den code, der am besten passt für das, was Sie tun, und versuchen, zu reduzieren die Menge der Arbeit, anstatt zu optimieren, wie es geht.
InformationsquelleAutor der Antwort Guffa
Grundsätzlich verwenden, was macht der code die meisten lesbar. Es gibt definitiv Orte, an denen der eine oder andere Konstrukte macht für sauberer, lesbarer und wartbarer. Das ist viel wichtiger, dass vielleicht sparen ein paar Nanosekunden in JavaScript-code.
InformationsquelleAutor der Antwort Jon Benedicto
Andere als syntax, ein switch kann implementiert werden unter Verwendung einer Struktur, die macht es
O(log n)
während ein if/else umgesetzt werden muss mit einemO(n)
prozeduralen Ansatz. Häufiger werden Sie sowohl prozedural verarbeitet und der einzige Unterschied ist die syntax, und außerdem ist es wirklich wichtig-es sei denn, Sie sind statisch eingeben 10k Fälle if/else, eh?InformationsquelleAutor der Antwort Evan Carroll
Ich glaube nicht, dass so
switch
ist nützlich/kurz-wenn Sie möchten verhindern, dass mehrereif-else
Bedingungen.Verhalten ist das gleiche in allen Browsern 🙂
InformationsquelleAutor der Antwort Sarfraz
InformationsquelleAutor der Antwort Koen
Es stellt sich heraus, dass, wenn-anders als im Allgemeinen schneller als Schalter
http://jsperf.com/switch-if-else/46
InformationsquelleAutor der Antwort sidonaldson
Spitzen Antwort schlägt die Verwendung eines Objekt-literal als alternative zu
switch
oderif
/else
. Ich mag diesen Ansatz auch, aber der code in der Antwort erstellt eine neuemap
Objekt jedes mal diedispatch
Funktion aufgerufen wird:Wenn
map
enthält eine große Anzahl von Einträgen kann dies zu einem deutlichen Mehraufwand. Es ist besser, die action-Karte nur einmal und dann verwenden Sie die bereits erstellte Karte zu jeder Zeit, zum Beispiel:InformationsquelleAutor der Antwort Michael Geary