Wie man die Größe eines JavaScript-Objekts?
Möchte ich die Größe wissen, belegt durch ein JavaScript-Objekt.
Nehmen Sie die folgende Funktion:
function Marks(){
this.maxMarks = 100;
}
function Student(){
this.firstName = "firstName";
this.lastName = "lastName";
this.marks = new Marks();
}
Nun instanziiere ich die student
:
var stud = new Student();
so, dass ich Sachen tun können, wie
stud.firstName = "new Firstname";
alert(stud.firstName);
stud.marks.maxMarks = 200;
etc.
Nun, die stud
Objekt besetzen Größe im Speicher. Es hat einige Daten und weitere Objekte.
Wie finde ich heraus, wie viel Speicher die stud
Objekt belegt? So etwas wie ein sizeof()
in JavaScript? Es wäre wirklich genial, wenn ich könnte finden Sie es heraus in einem einzigen Funktionsaufruf wie sizeof(stud)
.
Ich habe die Suche im Internet für Monate—konnte ihn nicht finden (bat, in ein paar Foren, keine Antworten).
Es gibt (entstehen) viele Gründe, warum ich brauche, um zu finden, die Größe eines Objekts in JavaScript. Ich bin neu in JavaScript, so dass ich nicht an die best practices. Ich bin immer noch lernen von Ihnen. Ich entwickelte eine firefox-Erweiterung, die ich bin sicher, ist mit mehr Speicher, als er sollte. Ich arbeite an ein paar Möglichkeiten, um (hoffentlich) die Speichernutzung zu reduzieren.. im reden über Tausende von Fällen viele Objekte pro tab, also Speicher ist nicht egal! Die Sache ist die, ich möchte wissen, ob mein Gedächtnis Bemühungen zur Reduzierung tatsächlich helfen bei der Verringerung der Speicher.. und um wie viel.
Wenn Sie gebaut haben, eine FF-Erweiterung würde ich dir raten, zu untersuchen, auf einem höheren Sprachniveau, als JS - sehen, was die Auswirkungen auf die FF selbst ist.
Sprache auf höherer Ebene als JS? was wäre das in diesem Fall?
Es ist nicht die Größe, die zählt trotzdem. Es ist, wie Sie es verwenden. PS: Was für ein Gestüt!
Zahl ein Grund, zu wissen, Objekt-Größe wäre für html5-offline-fähige Anwendungen, bei denen Sie teilweise begrenzten Speicherplatz ( 5-10Mb gegessen werden können-schnell aufgebaut für eine datenintensive Anwendung ).
Wenn Sie gebaut haben, eine FF-Erweiterung würde ich dir raten, zu untersuchen, auf einem höheren Sprachniveau, als JS - sehen, was die Auswirkungen auf die FF selbst ist.
Sprache auf höherer Ebene als JS? was wäre das in diesem Fall?
Es ist nicht die Größe, die zählt trotzdem. Es ist, wie Sie es verwenden. PS: Was für ein Gestüt!
Zahl ein Grund, zu wissen, Objekt-Größe wäre für html5-offline-fähige Anwendungen, bei denen Sie teilweise begrenzten Speicherplatz ( 5-10Mb gegessen werden können-schnell aufgebaut für eine datenintensive Anwendung ).
InformationsquelleAutor | 2009-08-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe wieder berücksichtigt den code in meiner original Antwort. Ich habe entfernt die Rekursion und entfernt die angenommene Existenz overhead.
Wer hier gelandet auf der Suche nach den kleinsten Art für die Zwecke der false/true, so scheint es zu sein, undefined/null.
Yep. Zeichen, die in JavaScript gespeichert sind, gemäß ECMA-262, 3rd Edition-Spezifikation - bclary.com/2004/11/07/#a-4.3.16
Diese Funktion nicht zählen Referenzen versteckt in Verschlüsse. Zum Beispiel
var a={n:1}; var b={a:function(){return a}}; roughSizeOfObject(b)
— hierb
hält Referenz aufa
, aberroughSizeOfObject()
zurück0
.Danke Roman für den Hinweis. Ich glaube nicht, aber denke es wäre sehr sinnvoll, sind das Ergebnis von Funktionen, aber es könnte nützlich sein, um irgendwie berechnen Sie die Größe der Funktion. Ich werde das prüfen. Ich habe auch schon erwägt, eine option, die dann auch die Größe der 'Schlüssel' name.
InformationsquelleAutor thomas-peter
Google Chrome Heap-Profiler können Sie überprüfen Objekt-Speicher verwenden.
Müssen Sie in der Lage zu finden das Objekt in der Spur, die kompliziert werden kann. Wenn Sie pin-das Objekt, um das Fenster global, es ist ziemlich einfach zu finden von der "Containment" - Liste Modus.
Im angehängten screenshot habe ich erstellt ein Objekt namens "testObj" auf dem Fenster. Ich habe dann mitten im profiler (nach der Aufnahme), und es zeigt die volle Größe des Objekts und alles, was es unter "Größe beibehalten".
Mehr details auf der Speicherkarte Pannen.
In der Abbildung oben, das Objekt zeigt ein beibehalten Größe von 60. Ich glaube die Einheit ist bytes hier.
comparison
Blick auf den Boden. Es macht offensichtlich, welche Objekte erstellt wurden, der zwischen zwei snapshots.Dies ist wahrscheinlich die sauberste Lösung.
Schön, vielen Dank.
Vergleich, erwähnt von @Johnride, ist jetzt ein pulldown-Menü an der Spitze.
Shallow size
scheint als 40 für beide{ a:"55c2067aee27593c03b7acbe", b:"55c2067aee27593c03b7acbe", c:null, d:undefined }
und{ c:null, d:undefined }
Objekte. Ist es OK?InformationsquelleAutor Guy Bedford
Ich schrieb diese lösen eine ähnliche (ish) problem. Es muss nicht genau das tun, was Sie vielleicht gesucht werden, dh es nicht berücksichtigt, wie der interpreter speichert das Objekt.
Aber, wenn Sie sind mit V8, es sollte Ihnen eine ziemlich ok Näherung als genial prototyping und versteckte Klassen zu lecken, bis die meisten der overhead.
Ich werde bench test heute Abend mit node.js und etwas besser Koeffizienten im Ort.
Die " bytes+= recurse( Wert[i] )' Zeile wirft ein Fehler in meinem FF 14.01: NS_ERROR_FAILURE: Komponente zurückgegeben Fehler-code: 0 x 80004005 (NS_ERROR_FAILURE) [nsIDOMHTMLInputElement.selectionStart]. Auf mein Objekt, wenn ich versuche eine andere, ist es nicht, vielleicht ein browser-bug, oder der code funktioniert nicht für jedes Objekt (derjenige, der nicht arbeitet, enthält Funktionen, die eine, die funktioniert nicht)
OK, vielen Dank. Ich habe wieder berücksichtigt diese Funktion nicht zu verwenden Rekursion. Ich hoffe, es funktioniert besser für Sie.
Es ist PHP (Schluck), dass muss ich achten - ich habe aufgehört zu lieben, der vor langer Zeit, aber Sie bezahlt die Rechnungen. Trotzdem, danke Tom, feedback, wie die Art und Weise ist besser als der Ruf-Punkte.
InformationsquelleAutor thomas-peter
Manchmal benutze ich diese Flagge wirklich große Objekte, die im Gange sein könnte, um den client vom server. Sie stellen nicht die in-memory-footprint. Es wird nur ungefähr, was es Kosten würde, um es zu senden oder zu speichern.
Beachten Sie auch, das es langsam, dev nur. Aber für immer eine grobe Antwort mit nur einer Zeile code ist es schon nützlich für mich.
Schade, es bricht, wenn Objekt ist zu groß. 🙁
Nicht verwenden kann, mit zirkulären Strukturen
VM1409:1 Uncaught TypeError: Converting circular structure to JSON
🙁 dennoch nützlichdies ist keine binäre Größe in bytes aber einfach zu nutzen, um die Ungefähre Größe
Das ist ziemlich großartig, wenn 1) Sie brauchen nur eine grobe Schätzung, 2) Sie wissen Sie haben noch keine zirkulären Referenzen 3) ausgelassen werden kann, große Werte und messure Sie separat. Diese waren alle wahr, in meinem Fall also perfekt funktioniert, ich hatte nur eine große Zeichenfolge an einer Stelle, die kann ich einfach Messen Sie die Länge auf.
InformationsquelleAutor zstew
Es ist ein NPM-Modul zu bekommen, sizeof Objekt, können Sie es mit
npm install object-sizeof
InformationsquelleAutor Andrei Karpushonak
Ein wenig spät zur party, aber hier ist eine etwas kompaktere Lösung für das problem:
Es ist in bytes.
Nettes script, muss änderungen für zyklische Verweise wenn.
Ich habe gerade getestet, den Algorithmus auf eine riesige Auswahl von Daten innerhalb eines Knotens Prozess berichtet es 13GB, aber Knoten verbraucht 22GB, eine Vorstellung darüber, wo der Unterschied herkommt? Es ist nichts mehr im Speicher.
Sie nicht berechnen, wie viel das Objekt selbst, sondern nur dessen Wert. Alle Objekte nehmen mehr Platz als nur Ihren Wert, sonst
typeof ...
würde nicht funktionieren.InformationsquelleAutor Dan
Dies ist ein hacky-Methode, aber ich versuchte es zweimal mit unterschiedlichen zahlen und es scheint, konsequent zu sein.
Was Sie tun können, ist zu versuchen, und reservieren Sie einen riesige Anzahl der Objekte, wie etwa eine oder zwei Millionen Objekte von der Art, die Sie wollen. Legen Sie die Objekte in ein array um zu verhindern, dass der garbage collector freigegeben (beachten Sie, dass dies fügt einen geringen Speicher-overhead, weil der array, aber ich hoffe das sollte keine Rolle spielen, und außer wenn Sie sich sorgen über die Objekte im Arbeitsspeicher, speichern Sie Sie irgendwo). Fügen Sie eine Warnung, bevor und nachdem die Zuordnung und in jedem alert können Sie überprüfen, wie viel Arbeitsspeicher der Firefox-Prozess unter. Bevor Sie öffnen die Seite mit dem test, stellen Sie sicher, Sie haben eine neue Firefox-Instanz. Öffnen Sie die Seite, beachten Sie die Speicher-Nutzung nach der "vor" - Warnung angezeigt wird. Schließen Sie die Warnung, warten, für die Speicher reserviert werden. Subtrahieren Sie die neue Speicherkarte aus der älteren und teilen Sie durch die Höhe der Zuweisungen. Beispiel:
Habe ich versucht, diese in meinem computer, und der Prozess hatte 48352K von Speicher, wenn die "vorher" - Warnmeldung angezeigt wurde. Nach der Zuteilung, Firefox hatte 440236K Speicher. Für 2 Millionen Zuweisungen, dieser ist etwa 200 bytes für jedes Objekt.
Versuchte ich es wieder mit 1 Million Zuweisungen und das Ergebnis war ähnlich: 196 bytes pro Objekt (ich nehme an, dass die zusätzlichen Daten in 2mill wurde für die Array).
So, hier ist ein hacky-Methode, die Ihnen helfen könnten. JavaScript kein "sizeof" - Methode für einen Grund: jeder JavaScript-Implementierung ist unterschiedlich. In Google Chrome zum Beispiel der gleichen Seite verwendet, etwa 66 bytes für jedes Objekt (ausgehend von der task-manager zumindest).
Jedes C und C++ implementation ist auch anders. 😉 Die Größe eines Datentyps in C oder C++ ist die Umsetzung-spezifisch. Ich sehe keinen Grund, warum JavaScript nicht unterstützen konnte einen solchen operator, wenn er nicht dienen würde den gleichen Zweck oder die gleiche Bedeutung wie in C oder C++ (die lower-level-Sprachen und Messen Sie die tatsächliche Größe des Feste-Größe-Daten-Typ zur compile-Zeit, anders als die variable Größe eines dynamischen JavaScript-Objekt zur Laufzeit).
InformationsquelleAutor Bad Sector
Sorry das konnte ich nicht kommentieren, so dass ich nur die Arbeit fortzusetzen, die von tomwrong.
Diese verbesserte version wird nicht gezählt Objekt mehr als einmal, damit keine Endlosschleife.
Plus, denke ich, dass der Schlüssel eines Objekts sollten auch gezählt werden, rund.
Überprüfung
typeof value === 'object'
ist nicht genug, und Sie haben Ausnahmen, wenn der Wertnull
.Das war rasend schnell, für mein Objekt (die ich bin mir ziemlich sicher haben weit über 5mb) im Vergleich mit @tomwrong ist betrogen zu Antworten. Es wurde auch genauer (wie es gesagt 3mb oder so), aber immer noch viel zu weit von der Realität entfernt. Irgendwelche Hinweise auf das, was es kann nicht zählen?
InformationsquelleAutor Liangliang Zheng
Folgenden auf diesen Kommentar, hier ist was Sie tun sollten:
Versuchen Sie, um zu produzieren ein problem mit dem Arbeitsspeicher - code Schreiben, der schafft alle diese Objekte und graudally erhöhen Sie den oberen Grenzwert, bis Sie lief in ein problem (Browser-Absturz, Browser einfrieren oder eine Out-Of-memory-Fehler). Idealerweise sollten Sie wiederholen Sie diesen Versuch mit verschiedenen Browsern und verschiedenen Betriebssystemen.
Nun gibt es zwei Möglichkeiten:
option 1 - Sie hatten keinen Erfolg bei der Herstellung der Speicher-problem. Daher, Sie werden sich Gedanken für nichts. Haben Sie nicht das Speicher-Problem und das Programm ist in Ordnung.
option 2 - Sie haben ein problem mit dem Arbeitsspeicher. Jetzt Fragen Sie sich, ob die Grenze, an der das problem aufgetreten ist angemessen (in anderen Worten: ist es wahrscheinlich, dass diese Menge von Objekten erstellt werden die bei der normalen Verwendung des Codes). Wenn die Antwort 'Nein' ist, dann bist du gut. Ansonsten jetzt wissen Sie, wie viele Objekte in Ihrem code erstellen kann. Überarbeitung des Algorithmus, so dass es nicht gegen dieses limit.
aber die Größe des Objekts hat keine Bedeutung, es sei denn, Sie wissen, Menge des verfügbaren Arbeitsspeichers. Da die Größe des Speichers ist wahrscheinlich ein Geheimnis bleiben, sprechen in Bezug auf die # - Objekte ist ebenso sinnvoll, wie das sprechen im Begriff der #bytes
InformationsquelleAutor Itay Maman
Wenn Ihr Hauptanliegen ist die Speicherauslastung des Firefox-Erweiterung, schlage ich vor, die überprüfung mit der Mozilla-Entwickler.
Mozilla stellt auf seiner wiki eine Liste der tools für die Analyse von memory leaks.
InformationsquelleAutor Vincent Robert
Chrome developer tools diese Funktionalität auf. Ich fand diesen Artikel sehr hilfreich und macht genau das, was Sie wollen:
https://developers.google.com/chrome-developer-tools/docs/heap-profiling
InformationsquelleAutor benja2729
Diese Javascript-Bibliothek
sizeof.js
tut die gleiche Sache.Gehören Sie wie diese
Den sizeof-Funktion nimmt ein Objekt als parameter und gibt seine Ungefähre Größe in bytes. Zum Beispiel:
Den sizeof-Funktion können Sie den Umgang mit Objekten, die mehrere Referenzen auf andere Objekte und rekursive Verweise.
Ursprünglich hier veröffentlicht.
InformationsquelleAutor Jayram Singh
InformationsquelleAutor Boris Rayskiy
Vielen Dank an alle, die gearbeitet hat code dafür!!!!
Ich wollte nur hinzufügen, dass ich habe Suche nach genau die gleiche Sache, aber in meinem Fall ist es für die Verwaltung eines cache der verarbeiteten Objekte zu vermeiden, dass zu re-analysieren und verarbeiten von Objekten verwenden von ajax-calls, die möglicherweise oder möglicherweise nicht vom browser zwischengespeichert. Dies ist besonders nützlich für Objekte, erfordert eine Menge Verarbeitung, in der Regel alles, was nicht im JSON-format, aber es kann sehr teuer zu halten diese Dinge im Cache, ein großes Projekt oder eine app/extension, Links laufen für eine lange Zeit.
Jedenfalls, ich benutze es für etwas so etwas wie:
Es ist ein stark Vereinfachtes Beispiel und kann einige Fehler, aber es gibt die Idee, wie Sie können es verwenden, um zu halten auf statische Objekte (Inhalt wird sich nicht ändern) mit einem gewissen Grad an Intelligenz. Dies kann erheblich reduzieren auf irgendwelche teuren Anforderungen an die Verarbeitung, die das Objekt hergestellt werden mussten, in den ersten Platz.
InformationsquelleAutor Haravikk
Ich benutze Chrome dev tools' Registerkarte Timeline, instanziieren zunehmend große Mengen von Objekten, und gut schätzt wie das. Sie können html verwenden, wie diese unten, als boilerplate, und ändern Sie es, besser zu simulieren die Eigenschaften Ihrer Objekte (Anzahl und Typen von Eigenschaften, etc...). Sie möchten möglicherweise klicken Sie auf das Papierkorb-bit-Symbol am unteren Rand, dass die dev-tools Registerkarte, vor und nach einem Lauf.
Instanziieren 2 Millionen Objekte von nur je ein Objekt (wie in diesem code oben) führt zu einer groben Berechnung von 50 bytes pro Objekt, der auf meine Chrom, gerade jetzt. Ändern Sie den code, erstellen Sie eine zufällige Zeichenfolge, die pro Objekt fügt einige 30 Byte pro Objekt, etc.
Hoffe, das hilft.
InformationsquelleAutor matanster
Wenn Sie brauchen, um programmgesteuert prüfen für ca. Größe von Objekten Sie können auch überprüfen, diese Bibliothek http://code.stephenmorley.org/javascript/finding-the-memory-usage-of-objects/, dass ich in der Lage gewesen zu verwenden, die für Objekte der Größe.
Ansonsten empfehle ich die Chrome/Firefox-Heap-Profiler.
InformationsquelleAutor Alex M
Ich glaube, Sie haben vergessen zu zählen 'array'.
InformationsquelleAutor fchas15
Ich wissen das ist absolut nicht der richtige Weg, es zu tun, aber es haben mir geholfen, ein paar mal in der Vergangenheit, um die ca-Objekt-Datei-Größe:
Schreiben Sie Ihren Einspruch/Antwort auf der Konsole oder einem neuen tab, kopieren Sie die Ergebnisse, um eine neue Editor-Datei, speichern Sie es, und überprüfen Sie die Größe der Datei. Die Editor-Datei selbst ist nur ein paar bytes, so bekommen Sie eine ziemlich genaue Objekt-Datei Größe.
Ich sagte, es war annähernd. Manchmal ist dir egal, ob es 1 MB oder 1.00001 MB, Sie wollen einfach nur, um zu wissen, eine Schätzung, diese Methode ist völlig in Ordnung.
InformationsquelleAutor Jeffrey Roosendaal