452 Stimmen

Wie kann man die Größe eines JavaScript-Objekts ermitteln?

Ich möchte die von einem JavaScript-Objekt belegte Größe wissen.

Nehmen Sie die folgende Funktion:

function Marks(){
  this.maxMarks = 100;
}

function Student(){
  this.firstName = "firstName";
  this.lastName = "lastName";
  this.marks = new Marks();
}

Jetzt instanziere ich die student :

var stud = new Student();

so dass ich Dinge tun kann wie

stud.firstName = "new Firstname";

alert(stud.firstName);

stud.marks.maxMarks = 200;

usw.

Nun, die stud Objekt wird eine gewisse Größe im Speicher belegen. Es enthält einige Daten und weitere Objekte.

Wie kann ich herausfinden, wie viel Speicherplatz die stud Objekt einnimmt? Etwas wie ein sizeof() in JavaScript? Es wäre wirklich toll, wenn ich es mit einem einzigen Funktionsaufruf herausfinden könnte, z.B. sizeof(stud) .

Ich habe das Internet monatelang durchsucht und konnte es nicht finden (ich habe in einigen Foren gefragt - keine Antworten).

238voto

thomas-peter Punkte 7440

Ich habe den Code in meiner Datenbank umstrukturiert. Originalantwort . Ich habe die Rekursion entfernt und den Overhead der angenommenen Existenz beseitigt.

function roughSizeOfObject( object ) {

    var objectList = [];
    var stack = [ object ];
    var bytes = 0;

    while ( stack.length ) {
        var value = stack.pop();

        if ( typeof value === 'boolean' ) {
            bytes += 4;
        }
        else if ( typeof value === 'string' ) {
            bytes += value.length * 2;
        }
        else if ( typeof value === 'number' ) {
            bytes += 8;
        }
        else if
        (
            typeof value === 'object'
            && objectList.indexOf( value ) === -1
        )
        {
            objectList.push( value );

            for( var i in value ) {
                stack.push( value[ i ] );
            }
        }
    }
    return bytes;
}

169voto

Guy Bedford Punkte 1855

Mit dem Google Chrome Heap Profiler können Sie die Speichernutzung von Objekten untersuchen.

Sie müssen in der Lage sein, das Objekt in der Spur zu lokalisieren, was sich als schwierig erweisen kann. Wenn Sie das Objekt an das globale Fenster anheften, ist es im Auflistungsmodus "Containment" recht einfach zu finden.

Auf dem beigefügten Screenshot habe ich ein Objekt namens "testObj" im Fenster erstellt. Ich habe dann im Profiler (nachdem ich eine Aufzeichnung gemacht habe) und es zeigt die volle Größe des Objekts und alles in ihm unter "retained size".

Weitere Einzelheiten zu den Speicheraufschlüsselungen .

Chrome profiler

Auf dem obigen Screenshot zeigt das Objekt eine beibehaltene Größe von 60. Ich glaube, die Einheit ist hier Byte.

108voto

zstew Punkte 1037

Manchmal verwende ich dies, um wirklich große Objekte zu kennzeichnen, die vom Server zum Client gelangen könnten. Es stellt nicht den Speicherplatzbedarf dar. Sie gibt nur an, was es ungefähr kosten würde, es zu senden oder zu speichern.

Beachten Sie auch, dass es langsam ist, nur für Entwickler. Aber für immer eine ungefähre Antwort mit einer Zeile Code ist es für mich nützlich gewesen.

roughObjSize = JSON.stringify(bigObject).length;

82voto

thomas-peter Punkte 7440

Ich habe dies gerade geschrieben, um ein ähnliches Problem zu lösen. Es tut nicht genau das, was Sie vielleicht suchen, dh es berücksichtigt nicht, wie der Interpreter das Objekt speichert.

Aber, wenn Sie V8 verwenden, sollte es Ihnen eine ziemlich ok Annäherung, wie die awesome Prototyping und versteckte Klassen lecken die meisten der Overhead.

function roughSizeOfObject( object ) {

    var objectList = [];

    var recurse = function( value )
    {
        var bytes = 0;

        if ( typeof value === 'boolean' ) {
            bytes = 4;
        }
        else if ( typeof value === 'string' ) {
            bytes = value.length * 2;
        }
        else if ( typeof value === 'number' ) {
            bytes = 8;
        }
        else if
        (
            typeof value === 'object'
            && objectList.indexOf( value ) === -1
        )
        {
            objectList[ objectList.length ] = value;

            for( i in value ) {
                bytes+= 8; // an assumed existence overhead
                bytes+= recurse( value[i] )
            }
        }

        return bytes;
    }

    return recurse( object );
}

79voto

Dan Punkte 2108

Hier ist eine etwas kompaktere Lösung für das Problem:

const typeSizes = {
  "undefined": () => 0,
  "boolean": () => 4,
  "number": () => 8,
  "string": item => 2 * item.length,
  "object": item => !item ? 0 : Object
    .keys(item)
    .reduce((total, key) => sizeOf(key) + sizeOf(item[key]) + total, 0)
};

const sizeOf = value => typeSizes[typeof value](value);

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