Nesting Funktionen und Performance in Javascript?

8

Einige Mitarbeiter sagen, dass die Verschachtelungsfunktionen schlecht für die Leistung sind und ich wollte darum bitten.

Sagen wir, ich habe die Funktion:

%Vor%

helper ist eine private Funktion, die nur innerhalb von calculateStuff verwendet wird. Deshalb wollte ich dies in calculateStuff einkapseln.

Ist das eine schlechtere Leistung als das:

%Vor%

Beachten Sie, dass ich im zweiten Fall help meinem Scope offen lege.

    
user1413969 20.10.2015, 23:04
quelle

2 Antworten

5

Mit Ihrem ersten Code wird bei jedem Aufruf von calculateStuff eine neue Kopie von helper erstellt.

Mit Ihrem zweiten Code teilen sich alle Anrufe die gleiche helper , aber sie verschmutzen den äußeren Bereich.

Wenn Sie helper wiederverwenden möchten, ohne den äußeren Bereich zu belasten, können Sie ein IIFE verwenden:

%Vor%     
Oriol 20.10.2015, 23:10
quelle
8

Theoretisch gibt es einen potenziellen Leistungseinfluss, da Sie jedes Mal, wenn calculateStuff aufgerufen wird, einen neuen Abschlusskontext für den Helfer erstellen müssen (weil er möglicherweise auf Variablen von verweist) der umschließende Bereich).

Ich bin ziemlich sicher , dass der JIT-Compiler in den meisten JavaScript-Engines erkennen sollte, dass Sie nicht wirklich auf Variablen aus dem übergeordneten Kontext zugreifen und die Bindung all dieser Werte einfach überspringen . Es mag sein, dass mir ein Randfall fehlt, wo dies normalerweise nicht möglich ist, aber es scheint gerade genug zu sein.

In jedem Fall sprechen wir von einem Overhead von mehreren Nanosekunden pro Iteration. Wenn Ihr Code also nicht viel ausgeführt wird, werden Sie den Zeitunterschied nie bemerken. Im Zweifelsfall profiliere es und überprüfe ...

Ich entschied mich, meinem eigenen Rat zu folgen und diese auf jsperf mit Safari 9 zu porträtieren do-nothing funktioniert wie in der ursprünglichen Frage angegeben, um den Aufwand beim Aufruf einer verschachtelten Funktion zu verdeutlichen:

Verschachtelte Funktionen: 136.000.000 Aufrufe pro Sekunde

Flache Funktionen: 1.035.000.000 cals pro Sekunde

Oriols IIFE-Version : 220.000.000 cals pro Sekunde

Offensichtlich sind die flachen Funktionen viel schneller als jede der alternativen Versionen. Wie auch immer , denken Sie an die Größe dieser Zahlen - selbst die "langsame" Version fügt der Ausführungszeit nur 0,007 Mikrosekunden hinzu. Wenn Sie in dieser Funktion irgendeine Art von Berechnung oder DOM-Manipulation durchführen, wird der Overhead der verschachtelten Funktion absolut vernachlässigt.

    
Mark Bessey 20.10.2015 23:14
quelle