Frage Kann ich Aufrufe von nativen Methoden in JavaScript beschleunigen? [Duplikat]


Diese Frage hat hier bereits eine Antwort:

Gemäß diese Antwort auf "Ist das Objekt leer?":

// Speed up calls to hasOwnProperty
var hasOwnProperty = Object.prototype.hasOwnProperty;

Ich habe mehrere Implementierungen von etwas ähnlichem in kleinen JavaScript-Bibliotheken gesehen, wie:

var slice = Array.prototype.slice;

//or

function slice(collection) {
    return Array.prototype.slice.call(collection);
}

Ich habe es schnell gemacht jsperf um diese Art von Sache zu testen, und Caching sah insgesamt ein bisschen schneller als nicht Caching, aber mein Test könnte fehlerhaft sein.

(Ich verwende das Wort "Cache", um die Methode in einer Variablen zu speichern.)

Der Kontext dieser Frage ist, wenn ein Entwickler die native Methode mehrmals aufrufen muss und was der beobachtbare Unterschied wäre.

Verhindert das Caching der nativen Methode, dass die Engine bei jedem Aufruf der Methode in das Objekt für die Methode schauen muss, wodurch das Caching eine schnellere Methode zum Aufruf nativer Methoden darstellt, wenn der Entwickler dieselbe native Methode mehrmals aufrufen muss?


6
2018-02-12 22:01


Ursprung


Antworten:


Wenn Sie verwenden Array.prototype.slice B. in einer Bibliothek, ist es sinnvoll, eine Variable zu erstellen, die diese Funktion enthält (var slice = Array.prototype.slice;) weil die Variable kann minimiert werden durch einen JavaScript-Minifier, den es nicht anders kann.

Wenn Sie die Funktion einer Variablen zuweisen, müssen Sie auch nicht die Prototypkette des Objekts durchlaufen, was zu einer etwas besseren Leistung führen kann.

Beachten Sie, dass es sich hierbei um eine Mikrooptimierung handelt, mit der Sie sich (im Allgemeinen) nicht zu sehr beschäftigen sollten - überlassen Sie dies einer modernen JavaScript-Engine.


4
2018-02-12 22:06



Das Speichern des Werts in einer Variablen bietet einige Optimierungsmöglichkeiten, da der Interpreter, wenn er eine lokale Variable ist, eine Analyse durchführen könnte, um zu erkennen, dass die Vatiable niemals mutiert wird. Auf der anderen Seite müssen Sie Globals wie Array immer dereferenzieren, da jeder sie jederzeit ändern kann.

Das heißt, ich habe keine Ahnung, ob dies für die Performance wichtig ist, besonders wenn Sie die JIT-Optimierungen in Betracht ziehen.

In der Regel der größte Grund für die Verwendung von Menschen var slice ist es, den Quellcode kurz zu halten.


1
2018-02-12 22:11