378 votes

Taille de l'objet JavaScript

Je veux connaître la taille occupée par un objet JavaScript.

Prenez la fonction suivante -

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

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

Maintenant j'instancie l'étudiant

var stud = new Student();

pour que je puisse faire des choses comme

stud.firstName = "new Firstname";

alert(stud.firstName);

stud.marks.maxMarks = 200;

etc...

maintenant, stud L'objet occupera une certaine taille en mémoire. Il contient des données et d'autres objets.

Comment puis-je savoir combien de mémoire le stud l'objet occupe ?

quelque chose comme un sizeof() en JavaScript ?

Ce serait vraiment génial si je pouvais le trouver en un seul appel de fonction, par exemple

sizeof(stud)

P.S. J'ai cherché sur Internet pendant des mois - je ne l'ai pas trouvé (j'ai demandé dans quelques forums - pas de réponse).

12voto

Liangliang Zheng Points 1056

Désolé, je ne pouvais pas commenter, donc je continue le travail de tomwrong. Cette version améliorée ne comptera pas les objets plus d'une fois, donc pas de boucle infinie. De plus, je pense que la clé d'un objet devrait également être comptée, en gros.

function roughSizeOfObject( value, level ) {
    if(level == undefined) level = 0;
    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' ) {
        if(value['__visited__']) return 0;
        value['__visited__'] = 1;
        for( i in value ) {
            bytes += i.length * 2;
            bytes+= 8; // an assumed existence overhead
            bytes+= roughSizeOfObject( value[i], 1 )
        }
    }

    if(level == 0){
        clear__visited__(value);
    }
    return bytes;
}

function clear__visited__(value){
    if(typeof value == 'object'){
        delete value['__visited__'];
        for(var i in value){
            clear__visited__(value[i]);
        }
    }
}

roughSizeOfObject(a);

7voto

Itay Maman Points 15470

Je veux savoir si mes efforts de réduction de la mémoire aident réellement à réduire la mémoire.

Pour faire suite à ce commentaire, voici ce que vous devriez faire : Essayez de produire un problème de mémoire - Écrivez un code qui crée tous ces objets et augmentez graduellement la limite supérieure jusqu'à ce que vous rencontriez un problème (plantage du navigateur, gel du navigateur ou erreur de mémoire insuffisante). Idéalement, vous devriez répéter cette expérience avec différents navigateurs et différents systèmes d'exploitation.

Maintenant, il y a deux options : option 1 - Vous n'avez pas réussi à produire le problème de mémoire. Par conséquent, vous vous inquiétez pour rien. Vous n'avez pas de problème de mémoire et votre programme fonctionne bien.

option 2- vous avez bien eu un problème de mémoire. Maintenant, demandez-vous si la limite à laquelle le problème est survenu est raisonnable (en d'autres termes : est-il probable que cette quantité d'objets soit créée lors d'une utilisation normale de votre code). Si la réponse est "non", tout va bien. Sinon, vous savez maintenant combien d'objets votre code peut créer. Retravaillez l'algorithme de façon à ce qu'il ne dépasse pas cette limite.

7voto

Jayram Points 3742

Cette bibliothèque Javascript sizeof.js fait la même chose. Incluez-le comme ceci

<script type="text/javascript" src="sizeof.js"></script>

La fonction sizeof prend un objet en paramètre et renvoie sa taille approximative en octets. Par exemple :

// define an object
var object =
    {
      'boolean' : true,
      'number'  : 1,
      'string'  : 'a',
      'array'   : [1, 2, 3]
    };

// determine the size of the object
var size = sizeof(object);

La fonction sizeof peut gérer les objets qui contiennent des références multiples à d'autres objets et des références récursives.

Publié à l'origine ici .

5voto

Vincent Robert Points 16530

Si votre principale préoccupation est l'utilisation de la mémoire de votre extension Firefox, je vous suggère de consulter les développeurs de Mozilla.

Mozilla fournit sur son wiki un liste d'outils pour analyser les fuites de mémoire .

5voto

benja2729 Points 45

Les outils de développement de Chrome disposent de cette fonctionnalité. J'ai trouvé cet article très utile et il fait exactement ce que vous voulez : https://developers.google.com/chrome-developer-tools/docs/heap-profiling

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X