In AS3 sollten Sie meiner Meinung nach alle Variablen außerhalb von Schleifen initialisieren, um die Leistung zu steigern. Ist dies auch bei JavaScript der Fall? Was ist besser / schneller / Best Practice?
var value = 0;
for (var i = 0; i < 100; i++)
{
value = somearray[i];
}
oder
for (var i = 0 ; i < 100; i++)
{
var value = somearray[i];
}
javascript
performance
davivid
quelle
quelle
Antworten:
Es gibt absolut keinen Unterschied in der Bedeutung oder Leistung in JavaScript oder ActionScript.
var
ist eine Direktive für den Parser und kein zur Laufzeit ausgeführter Befehl. Wenn ein bestimmter Bezeichnervar
an einer beliebigen Stelle in einem Funktionskörper (*) einmal oder mehrmals deklariert wurde , bezieht sich jede Verwendung dieses Bezeichners im Block auf die lokale Variable. Es spielt keine Rolle, ob innerhalb der Schleife, außerhalb der Schleife oder beidesvalue
deklariert istvar
.Folglich sollten Sie schreiben, was Sie am besten lesbar finden. Ich bin mit Crockford nicht einverstanden, dass es immer das Beste ist, alle Vars an die Spitze einer Funktion zu setzen. Für den Fall, dass eine Variable vorübergehend in einem Codeabschnitt verwendet wird, ist es besser,
var
in diesem Abschnitt zu deklarieren , damit der Abschnitt eigenständig ist und kopiert werden kann. Andernfalls kopieren Sie während des Refactorings einige Codezeilen in eine neue Funktion, ohne die zugehörigen Elemente separat auszuwählen und zu verschiebenvar
, und Sie haben einen versehentlichen globalen Fehler.Bestimmtes:
Crockford wird Ihnen empfehlen, das zweite zu entfernen
var
(oder beidevar
s zu entfernen undvar i;
oben zu tun ), und jslint wird Sie dafür beschimpfen. Aber IMO ist es wartbarer, beide zu behaltenvar
s und den gesamten zugehörigen Code zusammenzuhalten, anstatt ein zusätzliches, leicht vergessenes Stück Code oben in der Funktion zu haben.Persönlich neige ich dazu, als
var
erste Zuweisung einer Variablen in einem unabhängigen Codeabschnitt zu deklarieren , ob es in einem anderen Teil derselben Funktion eine andere separate Verwendung desselben Variablennamens gibt oder nicht. Für michvar
ist es eine unerwünschte JS-Warze , überhaupt deklarieren zu müssen (es wäre besser gewesen, wenn die Variablen standardmäßig lokal wären). Ich sehe es nicht als meine Pflicht an, die Einschränkungen von [einer alten Revision von] ANSI C auch in JavaScript zu duplizieren.(*: außer in verschachtelten Funktionskörpern)
quelle
var
das nur am Anfang einer Funktion verwendet wird, fordert nur die versehentliche Erstellung globaler Variablen. Und eine Masse von nicht verwandten Variablen, die alle an einer Stelle deklariert sind, ist semantisch bedeutungslos, insbesondere wenn einige dieser Variablen möglicherweise nie verwendet werden.Theoretisch sollte es in JavaScript keinen Unterschied machen, da die Sprache keinen Blockbereich hat, sondern nur einen Funktionsbereich.
Ich bin mir über das Leistungsargument nicht sicher, aber Douglas Crockford empfiehlt weiterhin, dass die
var
Anweisungen die ersten Anweisungen im Funktionskörper sein sollten. Zitieren aus Code-Konventionen für die JavaScript-Programmiersprache :Ich denke, er hat einen Punkt, wie Sie im folgenden Beispiel sehen können. Das Deklarieren der Variablen am oberen Rand der Funktion sollte den Leser nicht verwirren, zu glauben, dass die Variable
i
im Bereich desfor
Schleifenblocks enthalten ist:quelle
ecma- / javascript
diese zur Laufzeit, selbst wenn Sie Variablen innerhalb einer Schleife deklarieren . Das nennt man "Heben". Es sollte also keinen Unterschied geben.let
auf diese Antwort aus?Die
ECMA-/Javascript
Sprachehoists
jeder Variablen, die irgendwo oben in einer Funktion deklariert wird. Das ist , weil diese Sprache nicht habenfunction scope
und sich nicht habenblock scope
wie viele andere C-ähnliche Sprachen.Das ist auch bekannt als
lexical scope
.Wenn Sie so etwas deklarieren
Das kommt
hoisted
zu:Es macht also keinen Unterschied in der Leistung (aber korrigiere mich, wenn ich hier völlig falsch liege).
Ein viel besseres Argument dafür , eine Variable nicht an einer anderen Stelle als am Anfang einer Funktion zu deklarieren, ist die Lesbarkeit . Das Deklarieren einer Variablen innerhalb von
for-loop
kann zu der falschen Annahme führen, dass auf diese Variable nur innerhalb des Schleifenkörpers zugegriffen werden kann, was völlig falsch ist . Tatsächlich können Sie auf diese Variable überall im aktuellen Bereich zugreifen.quelle
let
auf diese Antwort aus?Nächstes Jahr werden alle Browser über JS-Engines verfügen, die den Code vorkompilieren, sodass der Leistungsunterschied (der sich aus dem wiederholten Parsen desselben Codeblocks und dem Ausführen der Zuweisung ergibt) vernachlässigbar werden sollte.
Optimieren Sie niemals die Leistung, es sei denn, Sie müssen. Wenn Sie Variablen beim ersten Mal in der Nähe des Ortes halten, an dem Sie sie benötigen, bleibt Ihr Code sauber. Auf der negativen Seite können Personen, die an Sprachen mit Blockbereichen gewöhnt sind, verwirrt sein.
quelle
Eine weitere Überlegung, die wir jetzt
let
undconst
in ES2015 haben, ist, dass Sie jetzt Variablen speziell für den Schleifenblock festlegen können. Wenn Sie also nicht dieselbe Variable außerhalb der Schleife benötigen (oder wenn jede Iteration von einer Operation abhängt, die mit dieser Variablen in der vorherigen Iteration ausgeführt wurde), ist dies wahrscheinlich vorzuziehen:quelle
Ich habe gerade einen einfachen Test in Chrome durchgeführt. Probieren Sie die Geige in Ihrem Browser aus und sehen Sie die Ergebnisse
Das Ergebnis ist, dass der letzte Test ~ 8 Sekunden dauert und die vorherigen 2 nur ~ 2 Sekunden sind. Sehr wiederholbar und unabhängig von der Reihenfolge.
Das beweist mir also, dass man die Vars immer außerhalb der Schleife deklarieren sollte. Ein merkwürdiger Fall für mich ist der erste, den ich
i
in der for () - Anweisung deklariere . Dieser scheint genauso schnell zu sein wie der zweite Test, bei dem ich den Index vordeklariere.quelle
var
Variable als global deklariert wird sei sowieso global.JavaScript ist eine Sprache, die unten von C oder C ++ geschrieben wurde. Ich bin mir nicht sicher, welche es ist. Und einer seiner Zwecke ist es, den Aufwand für den Umgang mit internem Speicher zu sparen. Selbst in C oder C ++ müssen Sie sich keine Gedanken darüber machen, ob es viele Ressourcen verbraucht, wenn Variablen in einer Schleife deklariert werden. Warum sollten Sie sich in JavaScript darum kümmern?
quelle
Nun, das hängt davon ab, was Sie erreichen möchten. Wenn Sie
value
annehmen, dass es sich nur um eine temporäre Variable innerhalb des Schleifenblocks handelt, ist es viel klarer, die zweite Form zu verwenden. Es ist auch logischer und ausführlicher.quelle
Es macht keinen Unterschied, ob Sie Variablen innerhalb oder außerhalb der for-Schleife deklarieren. Unten finden Sie den zu testenden Beispielcode.
Die Ergebnisse zeigten sich in meinem Fall
Vielen Dank - MyFavs.in
quelle
let
statt versuchtvar
unda()
neige dazu, etwas langsamer zu sein (wie 120 vs 115 ms = ~ 6% = IMO unbedeutend)Die Frage hier ist im Grunde, eine var innerhalb einer Schleife zu deklarieren. Denken Sie nur daran, was passiert, wenn Sie dies tun:
Glaubst du, das ist richtig? Nein ... weil Sie eine Variable nicht so oft deklarieren möchten. Wenn Sie eine Variable innerhalb einer Schleife deklarieren, deklariert sie dann nicht so oft, wie die Schleife ausgeführt wird? Offensichtlich wird es Sie schlagen, wenn Sie sich im Modus "Streng verwenden" befinden. Die Leute haben Crockford nicht zugestimmt, ohne über die ursprüngliche Frage nachzudenken.
Es ist also immer gut, Variablen oben zu deklarieren - 1. Zur besseren Lesbarkeit, 2. gute Gewohnheiten zu entwickeln.
quelle
In Bezug auf die Leistung nach dem Ausführen von Tests unter Chrome, Firefox und jsperf unter einem Linux-Betriebssystem scheint es einen Leistungsunterschied zwischen der Deklaration von Variablen in einer Schleife und außerhalb einer Schleife zu geben. Es ist ein kleiner Unterschied, aber dies wird auch durch die Anzahl der Iterationen und die Anzahl der Variablendeklarationen verstärkt.
Für eine optimale Leistung müsste ich daher vorschlagen, Variablen außerhalb der Schleife zu deklarieren. Oder deklarieren Sie Ihre Variablen noch besser in einer Zeile. Siehe Beispiel.
Beachten Sie, wie sich die Variablen 'al' und 'av' in der for-Schleifendeklarationszeile befinden. Diese Inline-Erklärung hat mir eine durchweg bessere Leistung gebracht. Auch über die Deklaration von Variablen außerhalb der Schleife. Auch hier ist der Leistungsunterschied sehr gering.
https://jsperf.com/outside-inline-for-loop-ase/1
quelle