Question

Question idiote, mais dans une application winforms sur laquelle je travaille actuellement, j'aimerais connaître le nombre d'octets alloués / utilisés par une liste < [SomeObject] > conservée en mémoire (pour des raisons statistiques). fins). Est-ce possible? J'ai effectué une recherche parmi les options possibles, mais il n'y a évidemment pas de méthode myList.GetTotalBytes () .

Était-ce utile?

La solution

Je ne suis pas sûr que le moteur d'exécution fournisse une méthode de programmation fiable pour obtenir la taille d'un objet. Cependant, certaines options s'offrent à vous:

  • utiliser un outil tel que CLR Profiler
  • utilisez Marshal.SizeOf () (retourne la taille non gérée de l'objet)
  • sérialisez votre objet en binaire pour une approximation

Autres conseils

Cela dépend vraiment de ce que vous voulez dire. Vous pouvez prédire combien d'octets seront utilisés par la liste elle-même - mais ce n'est pas la même chose que de prédire combien d'octets pourraient être éligibles pour le nettoyage de la mémoire si la liste devenait éligible pour la collecte.

Bits de la liste:

  • Le tableau de fond ( T [] - une référence à un tableau auquel seule la liste aura accès)
  • la taille (int)
  • Une racine de synchronisation (référence)
  • Le numéro de version (int)

Le plus difficile est de décider combien il faut compter. Chacun de ceux-ci est assez facile à calculer (en particulier si vous savez que T est un type de référence, par exemple), mais voulez-vous compter les objets référencés par la liste? Ces références sont-elles les seules ou non?

Vous dites que vous voulez savoir "à des fins statistiques". - Pourriez-vous être plus précis? Si vous pouvez dire ce qui vous intéresse vraiment (et un peu plus d’informations sur le contenu de la liste et s’il peut y avoir d’autres références aux mêmes objets), nous pourrions probablement vous aider davantage.

C'est peut-être une réponse compliquée, mais je vais aller de l'avant et dire que si vous effectuez des comparaisons statistiques, effectuez une sérialisation binaire de l'objet en MemoryStream. et regardez ensuite sa propriété Length en tant que telle:

    List<string> list = new List<string>
    {
        "This",
        "is",
        "a",
        "test"
    };

    using (Stream stream = new MemoryStream())
    {
        IFormatter formatter = new BinaryFormatter();

        formatter.Serialize(stream, list);
        Console.WriteLine(stream.Length);
    }

Notez que cela pourrait changer d’une version à l’autre du framework et ne serait utile que pour les comparaisons entre les graphes d’objet d’un même programme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top