6 Stimmen

Prototypische Vererbung sollte Speicherplatz sparen, oder?

Ich habe mich gefragt, ob die Verwendung von Prototypen in JavaScript sollte mehr Speicher effizienter als Anhängen jedes Mitglied eines Objekts direkt an sie aus den folgenden Gründen:

  • Der Prototyp ist nur ein einziges Objekt.
  • Die Instanzen enthalten nur Verweise auf ihren Prototyp.

Versus:

  • Jede Instanz enthält eine Kopie aller Mitglieder und Methoden, die durch den Konstruktor definiert sind.

Ich habe damit ein kleines Experiment gestartet:

var TestObjectFat = function()
    {
        this.number = 42;
        this.text = randomString(1000);
    }

var TestObjectThin = function()
    {
        this.number = 42;
    }
TestObjectThin.prototype.text = randomString(1000);

randomString(x) erzeugt einfach einen, nun ja, zufälligen String der Länge x.

Ich habe dann die Objekte in großen Mengen wie folgt instanziiert:

var arr = new Array();
for (var i = 0; i < 1000; i++) {
    arr.push(new TestObjectFat()); // or new TestObjectThin()
}

und überprüfte die Speichernutzung des Browserprozesses (Google Chrome). Ich weiß, das ist nicht sehr genau...

In beiden Fällen stieg jedoch der Speicherbedarf erwartungsgemäß erheblich an (etwa 30 MB für TestObjectFat ), aber die Prototyp-Variante benötigte nicht viel weniger Speicher (etwa 26 MB für TestObjectThin ).

Ich habe auch überprüft, dass die TestObjectThin Instanzen enthalten dieselbe Zeichenkette in ihrer Eigenschaft "text", so dass sie tatsächlich die Eigenschaft des Prototyps verwenden.

Ich bin mir nicht ganz sicher, was ich davon halten soll. Das Prototyping scheint nicht der große Speichersparer zu sein.

Ich weiß, dass das Prototyping aus vielen anderen Gründen eine gute Idee ist, aber hier geht es mir speziell um die Speichernutzung. Gibt es eine Erklärung, warum die Prototyp-Variante fast die gleiche Menge an Speicher verwendet? Übersehe ich etwas?

2voto

Yann Ramin Punkte 32375

Ihr Test ist verdächtig - es gibt einen erheblichen Overhead bei der Zuweisung von JavaScript-Objekten, die wahrscheinlich verzerrt Ihre Ergebnisse. Wenn Sie große Datenblöcke in Ihre Prototypklasse einfügen, kann es einen größeren Gewinn zeigen.

Leider ist die Speichernutzung in JavaScript schwer zu kontrollieren, vor allem, wenn JIT beteiligt ist (sind Ihre JIT-Methoden in der Speichernutzung Modell vertreten? usw.).

0 Stimmen

Ich könnte es mit viel längeren Zeichenfolgen in den Objekteigenschaften versuchen. Vielleicht wird das einen Unterschied zeigen...

1voto

Alsciende Punkte 25697

In beiden Fällen haben Sie 1000 Objekte erstellt, und ein Objekt ist viel speicherintensiver als eine Zeichenkette. Der Unterschied zwischen Thin und Fat bedeutet einen Gewinn von 999 Strings. Nehmen wir also an, dass die Erstellung eines Objekts (selbst eines einfachen) 26k kostet, während die Erstellung einer 1000 Zeichen breiten Zeichenfolge 4k kostet. Dann ist Ihre Beobachtung perfekt erklärt.

Fat = 1000 * 26Ko + 1000 * 4Ko = 30Mo
Thin = 1000 * 26Ko + 4Ko = 26Mo

0 Stimmen

Es fällt mir schwer zu glauben, dass ein einfaches Objekt wie dieses Speicher in dieser Größenordnung verbraucht. Sind Sie sich da sicher?

0 Stimmen

Auf keinen Fall. Ich wollte nur zeigen, dass Ihr Ergebnis erklärt werden kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X