2014-10-03 7 views
5

Ich habe über einige JavaScript-Code, der in einer performance-sensitiven Umgebung ausgeführt werden soll, vor allem eine Game-Engine in mobilen Umgebungen.Hat die Verwendung lokaler Variablen (statt wiederholten Zugriffs auf Eigenschaften) jemals die Leistung beeinträchtigt?

In vielen Fällen verwendet dieser Code keine lokalen Variablen, sondern verwendet stattdessen explizite Ketten, z.

if (this.x.y[z].i) { 
    this.x.y[z].a += this.x.y[z].b; 
} 

Wo beiden this.x.ythis.x.y.z und repräsentieren „Duplizierung“ - und, wenn keine der Zwischen Eigenschaften Getter hat, und wo q eine lokale Variable ist nicht anderweitig verwendet - semantisch äquivalent zum folgenden behandelt werden kann.

var q = this.x.y[z] 
if (q.i) { 
    q.a += q.b; 
} 

(Die Namen wurden vage besonders gehalten Vorspannung, um zu versuchen und zu mildern, diese Frage nicht über das „Muster“ zu folgen - obwohl ich das letzteres bevorzugen und die Absicht, es zu 100% zu nutzen und so fragen sind Diese Frage.)

Jetzt, bevor ich eine ganze Reihe von Kommentaren über "Code für Klarheit schreiben" und "nicht vorzeitig optimieren", lesen Sie weiter!

So angesichts der folgenden Aussagen/Axiom und stellt fest, dass diese Frage nicht darüber, wie die Leistung zu verbessern, sondern eher, wenn lokale cache/„alias“ Variablen können Abnahme Leistung auf relevanten JavaScript-Implementierungen:

  • Die Einführung einer lokalen Variablen, wenn ein Mitglied mehrmals aufgerufen wird, führt zu mehr klarem Code. (Dies ist subjektiv, aber ist ein Axiom für die Frage.)
  • Die Verwendung einer lokalen Variablen, wie für nicht-dynamische Eigenschaften gezeigt, wird immer die gleiche Semantik haben.
  • Es gibt keine Schließungen über die lokalen Variablen erstellt werden; als solche gibt es keine Bedenken, die Objektlebensdauern zu erhöhen oder anderweitig einen größeren Ausführungskontextsumfang beizubehalten.
  • Der Fokus liegt auf mobile Browser, einschließlich Nicht-/Niedrig-JIT-Sorten - z.B. JavaScriptCore und/oder was auch immer war auf Android vor V8.
  • Browser sind bereits gut für diesen Fall optimiert und es wird nicht erwartet, dass die Verwendung einer lokalen Variablen zu einer spürbaren "Leistungssteigerung" führen wird - diese Frage ist das Gegenteil.

Kann/wird mit lokalen Variablen statt von [mehreren] direkten Zugriff auf Eigenschaften führen zu einer Abnahme in der Leistung? Wo eine solche Abnahme "nicht vernachlässigbar ist .."

+2

Die Art, wie Sie eine solche Frage beantworten, ist das Testen. Im Allgemeinen wird das Speichern eines Werts in einer lokalen Variablen die Leistung nicht beeinträchtigen und wird sie wahrscheinlich verbessern. –

Antwort

1

Die Antwort hängt wahrscheinlich mehr vom Browser ab als vom Code. Beachten Sie, dass JavaScript erstellt wurde, um "interpretiert" zu werden, was bedeutet, dass der Code analysiert und ausgeführt wird, wenn er analysiert wird. In diesem Szenario wird die Deklaration einer lokalen Variablen jedes Mal, wenn die Funktion aufgerufen wird, geparst und ausgeführt, die diese Variablendeklaration enthält. Das kann nicht als "schnell" gelten.

Allerdings machen moderne JavaScript-Prozessoren die Dinge nicht mehr so; Sie kompilieren im Wesentlichen den Code, wenn die Webseite geladen wird.Die Deklaration einer lokalen Variablen wird nun einmal mit den Deklarationen aller anderen Variablen wie globals und object-properties abgearbeitet. In diesem Szenario ist es wahrscheinlich, dass es keine schnellste Möglichkeit zur Variablendeklaration gibt, da die Person, die den Code schreibt, lieber verwendet wird.