2013-04-25 17 views
7

Ich verwende switch-case Aussagen regelmäßig in ECMAscript. Neben meiner persönlichen Befürwortung, gibt es Tonnen von Fachliteratur, über die Leistung in dieser Sprache im Allgemeinen und über bedingte Aussagen speziell.Switch-Case-Leistung in ECMAscript

Ein gutes Beispiel, ich erinnere mich zum Beispiel, ist das ausgezeichnete Buch "High Performance Javascript" von Nicholas Zakas. Wie in vielen anderen Büchern und Artikeln, es wird gesagt, dass eine switch-case Aussage ist immer schneller als if (else) Aussagen, wenn Sie mehr als zwei bedingte Fälle verwenden.

In jeder C-wie Sprache, die ich kenne, eine switch-case Aussage nichts anderes als eine binary-Hash-Karte ist, die wieder abgebaut, ist eine Kette von jmp Codes in der Montage. Habe gut ein here

Doch nach diesem Vorwort lesen:

ich eine Diskussion über die Verwendung von Event-Handler-Funktionen hatte mit meinem Team und wie wir mit Event-Typen werden beschäftigen. Ob wir eine explizite Funktion für irgendein Ereignis verwenden oder nicht, oder ob wir eine große Funktion verwenden sollten, die mehrere Ereignistypen behandelt. Im Rahmen dieser Diskussion entwickelte sich die Performance Frage und wir haben ein sehr einfaches, einfach jsPerf:

http://jsperf.com/engine-context-data-caching-test/3

Und ich war ziemlich schockiert über die Ergebnisse und was ich sah. An diese Testfälle glaubend, ist die Bestellung von case statements drastisch auf der Ausführung der Ausführung wichtig. Der Unterschied zwischen long und longSlow dort ist nur die Position der case 'baz' Erklärung innerhalb der switch Aussage. Ist das echt und vernünftig?

Gibt es eine Chance, dass ich etwas übersehen? Zuerst dachte ich gut, vielleicht ist es nicht genug case Aussagen und der Interpreter schafft nur if-else Bedingungen unter der Haube, so dass ich die Zahl ohne Änderung der Ergebnisse erhöht.

Ich lehne ab, nur dass ECMAscript Motoren zu glauben, wie V8 und Spider, noch nicht um dieses Problem zu optimieren.

Antwort

4

Ich Referenzierung Quelle: http://oreilly.com/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html#sect2

Verwenden Sie die if-Anweisung, wenn:

  • Es gibt nicht mehr als zwei diskrete Werte, für die testen.

  • Es gibt eine große Anzahl von Werten, die leicht in Bereiche getrennt werden können.wenn

die switch-Anweisung verwenden:

  • Es gibt mehr als zwei, aber weniger als 10 diskrete Werte, für die testen.

  • Es gibt keine Bereiche für Bedingungen, da die Werte nichtlinear sind.

Verwenden Array-Lookup, wenn:

  • Es gibt mehr als 10 Werte, für die testen.

  • Die Ergebnisse der Bedingungen sind Einzelwerte und nicht eine Anzahl von Maßnahmen.

+3

Ihre Antwort wird geschätzt, aber sie beantwortet die Frage überhaupt nicht. Sie sollten die Frage noch einmal durchlesen und vielleicht eine gründliche Antwort geben :) –

Verwandte Themen