Als ich mir die Lösungen in den anderen Antworten ansah, sah ich einige Dinge, von denen ich weiß, dass sie schlecht für die Leistung sind. Ich wollte sie in einen Kommentar einfügen, aber ich dachte, es wäre besser, sie zu bewerten und die Ergebnisse zu teilen. Sie können es selbst testen . Unten sind meine Ergebnisse (ymmv) aufgeführt, die nach dem schnellsten Vorgang in jedem Browser normalisiert wurden (multiplizieren Sie die 1,0-Zeit mit dem normalisierten Wert, um die absolute Zeit in ms zu erhalten).
Chrome Firefox Opera MSIE-Safari-Knoten
-------------------------------------------------- -----------------
1,0 Zeit 37 ms 73 ms 68 ms 184 ms 73 ms 21 ms
wenn sofort 1,0 1,0 1,0 2,6 1,0 1,0
if-indirekt 1,2 1,8 3,3 3,8 2,6 1,0
sofort umschalten 2.0 1.1 2.0 1.0 2.8 1.3
Schaltbereich 38,1 10,6 2,6 7,3 20,9 10,4
Schaltbereich2 31,9 8,3 2,0 4,5 9,5 6,9
Switch-Indirect-Array 35.2 9.6 4.2 5.5 10.7 8.6
Array-Linear-Schalter 3.6 4.1 4.5 10.0 4.7 2.7
Array-Binärschalter 7.8 6.7 9.5 16.0 15.0 4.9
Der Test wurde unter Windows 7 32-Bit mit den folgenden Versionen durchgeführt: Chrome 21.0.1180.89m , Firefox 15.0 , Opera 12.02 , MSIE 9.0.8112 , Safari 5.1.7 . Node wurde auf einer Linux 64-Bit-Box ausgeführt, da die Timer-Auflösung unter Node.js für Windows 10 ms statt 1 ms betrug.
wenn sofort
Dies ist die schnellste in allen getesteten Umgebungen, außer in ... drumroll MSIE! (Überraschung Überraschung). Dies ist die empfohlene Methode zur Implementierung.
if (val < 1000) { /*do something */ } else
if (val < 2000) { /*do something */ } else
...
if (val < 30000) { /*do something */ } else
wenn-indirekt
Dies ist eine Variante von, switch-indirect-array
aber if
stattdessen mit -statements und arbeitet viel schneller als switch-indirect-array
in fast allen getesteten Umgebungen.
values=[
1000, 2000, ... 30000
];
if (val < values[0]) { /* do something */ } else
if (val < values[1]) { /* do something */ } else
...
if (val < values[29]) { /* do something */ } else
sofort wechseln
Dies ist in allen getesteten Umgebungen ziemlich schnell und in MSIE tatsächlich die schnellste. Es funktioniert, wenn Sie eine Berechnung durchführen können, um einen Index zu erhalten.
switch (Math.floor(val/1000)) {
case 0: /* do something */ break;
case 1: /* do something */ break;
...
case 29: /* do something */ break;
}
Schaltbereich
Dies ist in allen getesteten Umgebungen etwa 6 bis 40 Mal langsamer als die schnellste, mit Ausnahme von Opera, wo es etwa eineinhalb Mal so lange dauert. Es ist langsam, weil der Motor den Wert für jeden Fall zweimal vergleichen muss. Überraschenderweise dauert Chrome fast 40 Mal länger, um dies abzuschließen, verglichen mit dem schnellsten Vorgang in Chrome, während MSIE nur 6 Mal so lange dauert. Der tatsächliche Zeitunterschied betrug jedoch nur 74 ms zugunsten von MSIE bei 1337 ms (!).
switch (true) {
case (0 <= val && val < 1000): /* do something */ break;
case (1000 <= val && val < 2000): /* do something */ break;
...
case (29000 <= val && val < 30000): /* do something */ break;
}
Schaltbereich2
Dies ist eine Variante von switch-range
aber mit nur einem Vergleich pro Fall und daher schneller, aber immer noch sehr langsam, außer in Opera. Die Reihenfolge der case-Anweisung ist wichtig, da die Engine jeden Fall in der Quellcode-Reihenfolge ECMAScript262: 5 12.11 testet
switch (true) {
case (val < 1000): /* do something */ break;
case (val < 2000): /* do something */ break;
...
case (val < 30000): /* do something */ break;
}
Switch-Indirect-Array
In dieser Variante werden die Bereiche in einem Array gespeichert. Dies ist in allen getesteten Umgebungen langsam und in Chrome sehr langsam.
values=[1000, 2000 ... 29000, 30000];
switch(true) {
case (val < values[0]): /* do something */ break;
case (val < values[1]): /* do something */ break;
...
case (val < values[29]): /* do something */ break;
}
Array-Linear-Suche
Dies ist eine Kombination aus einer linearen Suche nach Werten in einem Array und der switch-Anweisung mit festen Werten. Der Grund, warum man dies verwenden möchte, ist, wenn die Werte erst zur Laufzeit bekannt sind. Es ist in jeder getesteten Umgebung langsam und dauert in MSIE fast zehnmal so lange.
values=[1000, 2000 ... 29000, 30000];
for (sidx=0, slen=values.length; sidx < slen; ++sidx) {
if (val < values[sidx]) break;
}
switch (sidx) {
case 0: /* do something */ break;
case 1: /* do something */ break;
...
case 29: /* do something */ break;
}
Array-Binärschalter
Dies ist eine Variante von, array-linear-switch
aber mit einer binären Suche. Leider ist es langsamer als die lineare Suche. Ich weiß nicht, ob es sich um meine Implementierung handelt oder ob die lineare Suche optimierter ist. Es kann auch sein, dass der Schlüsselbereich zu klein ist.
values=[0, 1000, 2000 ... 29000, 30000];
while(range) {
range = Math.floor( (smax - smin) / 2 );
sidx = smin + range;
if ( val < values[sidx] ) { smax = sidx; } else { smin = sidx; }
}
switch (sidx) {
case 0: /* do something */ break;
...
case 29: /* do something */ break;
}
Fazit
Wenn die Leistung wichtig ist, verwenden Sie if
-Statements oder switch
mit unmittelbaren Werten.