2013-05-28 13 views
15

Lassen Sie uns sagen Sie den folgenden komplexen Objekt haben:Benötigen Objektverweise zusätzlichen Speicher?

var object1 = .... // (something complexed) 

Dies nimmt x Menge an Speicher in Ihrer JS-Anwendung. Jetzt können Sie sagen, einige andere Objekte, die object1 Referenz:

var otherObject = { something: true, value: 'yes', object: object1 }; 

var anotherObject = { color: '#FFF', object: object1 }; 

Habe ich verdreifacht die Größe des Speichers, dass object1 ursprünglich aufnahm? Oder fügen die Verweise auf object1 den Overhead des verwendeten Speichers nicht hinzu?

Ich bin mir nicht sicher, wie ich das selbst testen soll, um die Antwort zu bestimmen. (Bonuspunkte, wenn Sie mir sagen können, wie Sie mich auf ein Tool verweisen können, mit dem Sie das Benchmarking durchführen können).

+0

Scheint eine gute Frage zu sein –

+2

Nun, Sie würden etwas Speicher benötigen, um anzuzeigen, dass die Referenz existiert. Ansonsten, wie wusstest du, ob es da ist oder nicht? – Joseph

Antwort

5

Objekte werden immer als Referenz in JavaScript übergeben (siehe popular answer). Zeiger auf ein Objekt benötigen natürlich eine gewisse Menge an Speicher (hängt von der Implementierung ab), aber viel weniger als das tatsächliche Objekt.

5

Werfen Sie einen Blick auf this question. Zahlen, Strings usw. werden immer nach Wert benannt, aber Objekte sind called by sharing; Das heißt, sie werden nach Wert benannt, aber der Wert ist eine Referenz auf das Objekt.

Mit anderen Worten, wenn Sie die Eigenschaften des Zeigers ändern, ändern Sie denselben Speicherpool wie das Objekt. Wenn Sie den Zeiger jedoch neu zuweisen, wirkt sich dies nicht auf das ursprüngliche Objekt aus.

Was dies bedeutet, ist, dass in Ihrem Beispiel, Sie haben nicht die Größe des Speichers verdreifacht dass object1 oben nahm, aber die zusätzlichen Hinweise auf object1 wird einige Speicherplatz in Anspruch nehmen. Genau wie viel Platz? Das hängt von der genauen Implementierung der Javascript-Engine ab, aber sie wird immer viel kleiner sein als die Größe des Objekts.

Soweit Benchmarking geht, schauen Sie sich Mozilla-Dokumentation für ihre JS-Engine, SpiderMonkey. Es gibt viele gute Dienstprogramme dort.

Verwandte Themen