Ich möchte wissen, wie groß ein JavaScript-Objekt ist.
Übernehmen Sie die folgende Funktion:
function Marks(){
this.maxMarks = 100;
}
function Student(){
this.firstName = "firstName";
this.lastName = "lastName";
this.marks = new Marks();
}
Jetzt instanziiere ich das student
:
var stud = new Student();
damit ich solche Sachen machen kann
stud.firstName = "new Firstname";
alert(stud.firstName);
stud.marks.maxMarks = 200;
etc.
Jetzt nimmt das stud
Objekt eine gewisse Größe im Speicher ein. Es hat einige Daten und mehr Objekte.
Wie finde ich heraus, wie viel Speicher das stud
Objekt belegt? So etwas wie ein sizeof()
in JavaScript? Es wäre wirklich großartig, wenn ich es in einem einzigen Funktionsaufruf wie herausfinden könnte sizeof(stud)
.
Ich habe monatelang im Internet gesucht - konnte es nicht finden (in einigen Foren gefragt - keine Antworten).
javascript
memory
object
sizeof
user4642212
quelle
quelle
Antworten:
Ich habe den Code in meiner ursprünglichen Antwort neu berücksichtigt . Ich habe die Rekursion entfernt und den angenommenen Existenzaufwand entfernt.
quelle
"よんもじ".length
ist 4 in Javascript, aber sind Sie sicher, dass es 8 Bytes sind, da Ihr Code es zurückgibt?var a={n:1}; var b={a:function(){return a}}; roughSizeOfObject(b)
- hier wirdb
verwiesena
, aberroughSizeOfObject()
zurückgegeben0
.Mit dem Google Chrome Heap Profiler können Sie die Verwendung des Objektspeichers überprüfen.
Sie müssen in der Lage sein, das Objekt in der Ablaufverfolgung zu finden, was schwierig sein kann. Wenn Sie das Objekt an das globale Fenster anheften, ist es im Listenmodus "Containment" ziemlich einfach zu finden.
Im angehängten Screenshot habe ich im Fenster ein Objekt namens "testObj" erstellt. Ich habe mich dann im Profiler befunden (nachdem ich eine Aufnahme gemacht habe) und es zeigt die volle Größe des Objekts und alles darin unter "beibehaltene Größe".
Weitere Details zu den Speicherausfällen .
Im obigen Screenshot zeigt das Objekt eine beibehaltene Größe von 60. Ich glaube, die Einheit besteht hier aus Bytes.
quelle
comparison
Ansicht unten aus. Es wird deutlich, welche Objekte zwischen den beiden Schnappschüssen erstellt wurden.Shallow size
scheint , als 40 für beide{ a:"55c2067aee27593c03b7acbe", b:"55c2067aee27593c03b7acbe", c:null, d:undefined }
und{ c:null, d:undefined }
Objekte. Ist es o.k?node --inspect
und in Chrome geben Sie ihnabout:inspect
in die URL-Leiste ein und suchen Sie nach dem Öffnen des Node Inspector. Erstellen Sie Ihr Objekt in der Knoten-CLI und erstellen Sie dann einen Heap-Snapshot.Ich habe dies gerade geschrieben, um ein ähnliches (ish) Problem zu lösen. Es macht nicht genau das, wonach Sie suchen, dh es berücksichtigt nicht, wie der Interpreter das Objekt speichert.
Wenn Sie jedoch V8 verwenden, sollte dies eine ziemlich gute Annäherung sein, da das großartige Prototyping und die versteckten Klassen den größten Teil des Overheads ausmachen.
quelle
Manchmal benutze ich dies, um wirklich große Objekte zu kennzeichnen, die möglicherweise vom Server an den Client gesendet werden. Es repräsentiert nicht den Footprint im Speicher. Sie erhalten nur ungefähr das, was es kosten würde, es zu senden oder zu speichern.
Beachten Sie auch, dass es langsam ist, nur Entwickler. Aber um eine Standardantwort mit einer Codezeile zu erhalten, war es für mich nützlich.
quelle
VM1409:1 Uncaught TypeError: Converting circular structure to JSON
:( immer noch nützlichHier ist eine etwas kompaktere Lösung für das Problem:
quelle
typeof ...
würden sie nicht funktionieren.Es gibt ein NPM-Modul zum Abrufen der Objektgröße , mit dem Sie es installieren können
npm install object-sizeof
quelle
Dies ist eine hackige Methode, aber ich habe es zweimal mit verschiedenen Zahlen versucht und es scheint konsistent zu sein.
Sie können versuchen, eine große Anzahl von Objekten zuzuweisen , z. B. ein oder zwei Millionen Objekte der gewünschten Art. Platzieren Sie die Objekte in einem Array, um zu verhindern, dass der Garbage Collector sie freigibt (beachten Sie, dass dies aufgrund des Arrays einen leichten Speicheraufwand verursacht, aber ich hoffe, dass dies keine Rolle spielt und außerdem, wenn Sie sich Sorgen machen, dass sich Objekte im Speicher befinden , Sie speichern sie irgendwo). Fügen Sie vor und nach der Zuweisung eine Warnung hinzu und überprüfen Sie in jeder Warnung, wie viel Speicher der Firefox-Prozess belegt. Stellen Sie vor dem Öffnen der Seite mit dem Test sicher, dass Sie über eine neue Firefox-Instanz verfügen. Öffnen Sie die Seite und beachten Sie die Speichernutzung, nachdem die Warnung "Vorher" angezeigt wurde. Schließen Sie die Warnung und warten Sie, bis der Speicher zugewiesen wurde. Subtrahieren Sie den neuen Speicher vom älteren und dividieren Sie ihn durch die Anzahl der Zuordnungen.
Ich habe dies auf meinem Computer versucht und der Prozess hatte 48352 KB Speicher, als die Warnung "Vorher" angezeigt wurde. Nach der Zuweisung hatte Firefox 440236 KB Speicher. Bei 2 Millionen Zuordnungen sind dies ungefähr 200 Bytes für jedes Objekt.
Ich habe es erneut mit 1 Million Zuordnungen versucht und das Ergebnis war ähnlich: 196 Bytes pro Objekt (ich nehme an, die zusätzlichen Daten in 2 Mill wurden für Array verwendet).
Hier ist eine hackige Methode, die Ihnen helfen könnte. JavaScript bietet aus einem bestimmten Grund keine "sizeof" -Methode: Jede JavaScript-Implementierung ist anders. In Google Chrome verwendet dieselbe Seite beispielsweise ungefähr 66 Byte für jedes Objekt (zumindest nach dem Task-Manager).
quelle
Entschuldigung, ich konnte keinen Kommentar abgeben, also setze ich einfach die Arbeit von Tomwrong fort. Diese erweiterte Version zählt Objekte nicht mehr als einmal, also keine Endlosschleife. Außerdem denke ich, dass der Schlüssel eines Objekts ungefähr gezählt werden sollte.
quelle
typeof value === 'object'
reicht nicht aus und Sie haben Ausnahmen, wenn der Wert istnull
.level
enthält Daten,roughSizeOfObject(level)
gibt jedoch Null zurück. (Meine variable Ebene ist natürlich nicht mit Ihrem Argument zu verwechseln. Ich denke nicht, dass das Abschatten von Variablen hier ein Problem verursachen sollte, und auch wenn ich die Ebene in Ihrem Skript umbenenne, erhalte ich das gleiche Ergebnis.) Screenshot : snipboard.io/G7E5yj.jpgDas gleiche Problem haben. Ich habe bei Google gesucht und möchte diese Lösung mit der Stackoverflow-Community teilen.
Wichtig :
Was denkst du darüber?
quelle
Im Anschluss an diesen Kommentar sollten Sie Folgendes tun: Versuchen Sie, ein Speicherproblem zu erzeugen - Schreiben Sie Code, der alle diese Objekte erstellt, und erhöhen Sie die Obergrenze grafisch, bis Sie auf ein Problem stoßen (Browserabsturz, Einfrieren des Browsers oder ein Out-Of-). Speicherfehler). Idealerweise sollten Sie dieses Experiment mit verschiedenen Browsern und verschiedenen Betriebssystemen wiederholen.
Jetzt gibt es zwei Möglichkeiten: Option 1 - Es ist Ihnen nicht gelungen, das Speicherproblem zu erzeugen. Daher sorgen Sie sich um nichts. Sie haben kein Speicherproblem und Ihr Programm ist in Ordnung.
Option 2: Sie haben ein Speicherproblem. Fragen Sie sich nun, ob die Grenze, an der das Problem aufgetreten ist, angemessen ist (mit anderen Worten: Ist es wahrscheinlich, dass diese Anzahl von Objekten bei normaler Verwendung Ihres Codes erstellt wird)? Wenn die Antwort "Nein" lautet, geht es Ihnen gut. Ansonsten wissen Sie jetzt, wie viele Objekte Ihr Code erstellen kann. Überarbeiten Sie den Algorithmus so, dass er diese Grenze nicht überschreitet.
quelle
Wenn Ihr Hauptanliegen die Speichernutzung Ihrer Firefox-Erweiterung ist, empfehlen wir Ihnen, sich bei Mozilla-Entwicklern zu erkundigen.
Mozilla bietet in seinem Wiki eine Liste von Tools zur Analyse von Speicherlecks .
quelle
Diese Javascript-Bibliothek
sizeof.js
macht das Gleiche. Schließen Sie es so einDie Funktion sizeof verwendet ein Objekt als Parameter und gibt seine ungefähre Größe in Byte zurück. Beispielsweise:
Die Funktion sizeof kann Objekte verarbeiten, die mehrere Verweise auf andere Objekte und rekursive Verweise enthalten.
Ursprünglich hier veröffentlicht .
quelle
Chrome-Entwicklertools verfügen über diese Funktionalität. Ich fand diesen Artikel sehr hilfreich und mache genau das, was Sie wollen: https://developers.google.com/chrome-developer-tools/docs/heap-profiling
quelle
Vielen Dank an alle, die dafür an Code gearbeitet haben!
Ich wollte nur hinzufügen, dass ich genau das Gleiche gesucht habe, aber in meinem Fall dient es dazu, einen Cache mit verarbeiteten Objekten zu verwalten, um zu vermeiden, dass Objekte aus Ajax-Aufrufen, die möglicherweise zwischengespeichert wurden oder nicht, erneut analysiert und verarbeitet werden müssen vom Browser. Dies ist besonders nützlich für Objekte, die viel Verarbeitung erfordern, normalerweise alles, was nicht im JSON-Format vorliegt. Es kann jedoch sehr kostspielig werden, diese Dinge in einem großen Projekt oder einer App / Erweiterung zwischenzuspeichern, die noch lange ausgeführt wird Zeit.
Wie auch immer, ich benutze es für so etwas wie:
Es ist ein vereinfachtes Beispiel und kann einige Fehler enthalten, aber es gibt die Idee, da Sie es verwenden können, um statische Objekte (Inhalte ändern sich nicht) mit einem gewissen Maß an Intelligenz festzuhalten. Dies kann die teuren Verarbeitungsanforderungen, die das Objekt überhaupt stellen musste, erheblich reduzieren.
quelle
quelle
Ich verwende die Registerkarte " Zeitleiste" der Chrome-Entwicklungstools , instanziiere immer mehr Objekte und erhalte solche guten Schätzungen. Sie können HTML wie dieses unten als Boilerplate verwenden und es ändern, um die Eigenschaften Ihrer Objekte (Anzahl und Art der Eigenschaften usw.) besser zu simulieren. Möglicherweise möchten Sie vor und nach einem Lauf auf das Papierkorbsit-Symbol unten auf der Registerkarte "Entwicklungswerkzeuge" klicken.
Das Instanziieren von 2 Millionen Objekten mit jeweils nur einer Eigenschaft (wie in diesem Code oben) führt derzeit zu einer groben Berechnung von 50 Bytes pro Objekt auf meinem Chromium. Durch Ändern des Codes zum Erstellen einer zufälligen Zeichenfolge pro Objekt werden etwa 30 Byte pro Objekt usw. hinzugefügt. Ich hoffe, dies hilft.
quelle
Wenn Sie programmgesteuert nach ca. suchen müssen. Größe von Objekten Sie können auch diese Bibliothek überprüfen http://code.stephenmorley.org/javascript/finding-the-memory-usage-of-objects/ , die ich für die Objektgröße verwenden konnte.
Ansonsten schlage ich vor, den Chrome / Firefox Heap Profiler zu verwenden.
quelle
Ich glaube, Sie haben vergessen, 'Array' einzuschließen.
quelle
Ich weiß, dass dies absolut nicht der richtige Weg ist, aber es hat mir in der Vergangenheit einige Male geholfen, die ungefähre Objektdateigröße zu ermitteln:
Schreiben Sie Ihr Objekt / Ihre Antwort in die Konsole oder auf eine neue Registerkarte, kopieren Sie die Ergebnisse in eine neue Editor-Datei, speichern Sie sie und überprüfen Sie die Dateigröße. Die Editor-Datei selbst besteht nur aus wenigen Bytes, sodass Sie eine ziemlich genaue Größe der Objektdatei erhalten.
quelle