Leute, ich habe ein paar Fragen:
- Gibt es in JavaScript einen Leistungsunterschied zwischen einer
switch
Anweisung und einerif...else
? - Wenn ja warum?
- Ist das Verhalten
switch
undif...else
andere in allen Browsern? (FireFox, IE, Chrome, Opera, Safari)
Der Grund für diese Frage ist, dass ich bei einer switch
Aussage mit ca. 1000 Fällen in Firefox anscheinend eine bessere Leistung erhalte .
Bearbeitet Leider ist dies nicht mein Code. Das Javascript wird serverseitig aus einer kompilierten Bibliothek erstellt und ich habe keinen Zugriff auf den Code. Die Methode, mit der das Javascript erstellt wird, wird aufgerufen
CreateConditionals(string name, string arrayofvalues, string arrayofActions)
note arrayofvalues
ist eine durch Kommas getrennte Liste.
was es produziert ist
function [name] (value) {
if (value == [value from array index x]) {
[action from array index x]
}
}
Hinweis: Dabei wird [name]
der Name an die serverseitige Funktion übergeben
Jetzt habe ich die Ausgabe der Funktion, die in eine TextArea eingefügt werden soll, geändert, JavaScript-Code geschrieben, um die Funktion zu analysieren, und ihn in eine Reihe von case
Anweisungen konvertiert .
Schließlich starte ich die Funktion und sie läuft gut, aber die Leistung unterscheidet sich in IE und Firefox.
quelle
Antworten:
Allgemein antworten:
Teststelle
quelle
switch
undif/then
Anweisungen in JS gibt. Der Artikel besagt, dass dies auf eine fleckigeswitch
Optimierung und die unterschiedlichen Funktionsweisen verschiedener JS-Engines zurückzuführen ist. Zitat:Since most JavaScript engines don’t have such optimizations, performance of the switch statement is mixed.
Manchmal ist es besser, keine zu verwenden. In einer "Versandsituation" können Sie beispielsweise mit Javascript ganz andere Dinge tun:
Das Einrichten einer Mehrwegverzweigung durch Erstellen eines Objekts bietet viele Vorteile. Sie können Funktionen dynamisch hinzufügen und entfernen. Sie können die Versandtabelle aus Daten erstellen. Sie können es programmgesteuert untersuchen. Sie können die Handler mit anderen Funktionen erstellen.
Es gibt den zusätzlichen Aufwand eines Funktionsaufrufs, um das Äquivalent eines "Falls" zu erhalten, aber den Vorteil (wenn es viele Fälle gibt) einer Hash-Suche, um die Funktion für einen bestimmten Schlüssel zu finden.
quelle
Der Leistungsunterschied zwischen a
switch
undif...else if...else
ist gering, sie machen im Grunde die gleiche Arbeit. Ein Unterschied zwischen ihnen, der einen Unterschied machen kann, besteht darin, dass der zu testende Ausdruck nur gelegentlichswitch
ausgewertet wirdif
. Wenn es teuer ist, den Ausdruck zu bewerten, ist es natürlich schneller, ihn einmal zu machen, als ihn hundertmal zu machen.Der Unterschied in der Implementierung dieser Befehle (und aller Skripte im Allgemeinen) unterscheidet sich zwischen den Browsern erheblich. In verschiedenen Browsern treten häufig große Leistungsunterschiede für denselben Code auf.
Da Sie kaum den gesamten Code in allen Browsern auf Leistung testen können, sollten Sie sich für den Code entscheiden, der am besten zu Ihrer Arbeit passt, und versuchen, den Arbeitsaufwand zu reduzieren, anstatt die Arbeitsweise zu optimieren.
quelle
Verwenden Sie grundsätzlich alles, was den Code am besten lesbar macht. Es gibt definitiv Orte, an denen das eine oder andere Konstrukt sauberer, lesbarer und wartbarer ist. Dies ist weitaus wichtiger als das Speichern einiger Nanosekunden in JavaScript-Code.
quelle
if..else
und werdenswitch
durch diese verursacht.Anders als die Syntax kann ein Switch mithilfe eines Baums implementiert werden, der ihn erstellt
O(log n)
, während ein if / else mit einemO(n)
prozeduralen Ansatz implementiert werden muss. Häufiger werden beide prozedural verarbeitet und der einzige Unterschied ist die Syntax. Darüber hinaus spielt es wirklich eine Rolle - es sei denn, Sie geben statisch 10.000 Fälle von if / else ein?quelle
Die Antwort von Pointy schlägt die Verwendung eines Objektliteral als Alternative zu
switch
oderif
/ vorelse
. Ich mag diesen Ansatz auch, aber der Code in der Antwort erstelltmap
jedes Mal ein neues Objekt, wenn diedispatch
Funktion aufgerufen wird:Wenn
map
eine große Anzahl von Einträgen enthalten ist, kann dies zu einem erheblichen Overhead führen. Es ist besser, die Aktionskarte nur einmal einzurichten und dann jedes Mal die bereits erstellte Karte zu verwenden, zum Beispiel:quelle
Ich denke nicht,
switch
ist nützlich / kurz, wenn Sie mehrereif-else
Bedingungen verhindern wollen .Das Verhalten ist in allen Browsern gleich :)
quelle
switch is useful/short if you want prevent multiple if-else conditions.
Ja, Sir, großartiger Beitrag.quelle
Es stellt sich heraus, dass if-else im Allgemeinen schneller als switch ist
http://jsperf.com/switch-if-else/46
quelle