Ich habe vor kurzem begonnen, mehr Getter-Funktionen zu verwenden als direkten Zugriff, um meinen Code flexibler zu machen. Ich bin gespannt, was das an Geschwindigkeit kostet. Angenommen, earth
ist ein Objekt und wir haben das folgende übergeordnete Objekt:
Gibt es einen nicht zu vernachlässigenden Geschwindigkeitsunterschied zwischen den folgenden beiden Aussagen?
%Vor%In V8:
Eine Funktion, die so kurz ist und keine Kontext zugewiesenen Variablen hat, wird inline. Es sei denn natürlich hat sich zu viel Inlining bereits angesammelt, in welchem Fall der Aufruf immer noch sehr billig ist, da der gesamte ausführende Teil der Funktion in eine 64-Byte-Instruktions-Cache-Zeile passt.
Kontext zugewiesene Variablen treten auf, wenn Ihre Funktion beispielsweise arguments
verwendet, ohne sich im strikten Modus zu befinden, oder interne Funktionen definiert, die auf die Variablen der Funktion verweisen. Ein weiteres Problem ist, dass auf x64-Funktionen nicht inline ausgeführt werden können, wenn der Anrufer und der Angerufene nicht den gleichen Kontext teilen können, also allesamt Schließungen wie die Pest vermeiden.
Siehe: Ссылка obwohl es aussieht, als würde firefox die tote Code-Eliminierung verwenden (was frustrierend ist, warum Zeit damit verschwenden?).
Bonus: dieser JSperf macht die Getter-Funktion absichtlich nicht-inlinable (durch den riesigen Kommentar, der die heuristische Funktion-Größe macht scheitern) im aktuellen V8. Sie können sehen, dass, selbst wenn die Funktion nicht inline war, es immer noch nur 25% langsamer ist, als direkt auf die Requisite zu verweisen.
Beachten Sie, dass, wenn eine Funktion nicht inline ausgeführt werden kann, diese als Blackbox betrachtet wird, deren Nebenwirkungen der aufrufenden Funktion nicht bekannt sind. Daher ist die Geschwindigkeit sehr kontextabhängig für den Code.
Sie müssen keine redundanten Getter / Setter-Funktionen wie diese in JavaScript erstellen. Wenn Sie zu einem späteren Zeitpunkt eine Validierung beim Festlegen einer Eigenschaft oder einer Vorbereitung beim Abrufen einer Eigenschaft benötigen, können Sie dies tun.
%Vor%... und nicht die Verwendung des Objekts ändern.
Tags und Links javascript performance getter