molily: Geschwindigkeit von Javascript-Befehlen?

Beitrag lesen

Ich bin eigentlich mehr an der Arbeitsweise von Javasvript interessiert.

Dann musst du in die Interpreter und Virtual Machines schauen, auf denen JavaScript ausgeführt wird. Das ist nicht so banal, wie du dir das vorstellst und hängt einfach stark vom genauen Aufbau des Scriptes und von der verwendeten JS-Engine ab.

Wie viel Schritte müssen bei switch im Speicher ausgeführt werden

Der Bezeichner y wird über die Scope Chain aufgelöst, sodass zunächst beim internen Variablenobjekt der gegenwärtig ausgeführten Funktion gesucht wird oder direkt, sofern der Code global ist, beim globalen Objekt window.

Dann wird der Wert der Variable mit dem ===-Operator mit dem Wert des gegebenen String-Literals verglichen. Falls die übereinstimmen, wird der nachfolgende Code ausgeführt (wenn du dann nicht break; sagst der folgende auch noch).

Switch wird problematisch, sobald du viele Cases hast. Dann müssen u.U. sehr viele ===-Vergleiche gemacht werden - das könnte der Compiler aber im Prinzip mit einem Hash-Table wegoptimieren, zumindest wenn nach allen case ein fester String-Literal folgt. Da aber eine Expression folgen darf, die bei jedem neuen Abarbeiten ausgeführt wird, würde ich nicht mit einer solchen Optimierung rechnen.

wie viele beim Aufruf als Funktion?

Der Bezeichner y wird wie oben aufgelöst, dasselbe geschieht mit window. Dann wird beim window-Objekt nach einem entsprechenden Member gesucht und dieser als Funktion aufgerufen.

Funktionsaufrufe können teuer sein, allerdings ist es keine Lösung, auf Codestrukturierung mittels Funktionen bloß der Performance halber zu verzichten. Vorher sollte man den Algorithmus optimieren, sodass die Notwendigkeit von Funktionsaufrufen minimiert wird. Aktuelle JS-Engines wie Chrome und JavaScriptCore haben da unglaubliche Fortschritte gemacht - da ist der Funktionsaufruf an sich kein nennenswertes Problem mehr.

Geht switch vielleicht schneller, weil die Funktionen im Speicher erst "lange" gesucht werden müssen?

Wenn du genau angibst, an welchem Objekt gesucht werden muss, kostet der Eigenschaftszugriff sehr wenig, weil das Nachschlagen z.B. in einem Hash-Table äußerst performant ist.

Oder ist das auch alles vom Browser abhängig, wie die Befehle umgesetzt werden?

Ja!

Ich dachte, das es da vielleicht so was wie einen Standard gibt, den alle Browser nutzen.

Der Standard regelt, wie die Sprache nach »außen« hin funktionieren soll und wie das »interne« Vorgehen gelöst ist. Das ist aber äußerst abstrakt. Wie der einzelne JavaScript-Interpreter das dann in Maschinencode umsetzt, ist eine ganz andere Geschichte.

Mathias