2008-10-21 5 views

Répondre

2

Vous demandez probablement quelque chose que vous pourriez appeler à partir de votre code (que je voudrais savoir aussi), mais je pense que je devrais mentionner Ants profiler [http://www.red-gate.com/Products/ants_profiler/index.htm] dans le cas où les autres ne cherchent pas quelque chose de spécifique. Il vous dira toutes sortes d'informations sur votre code pendant son exécution, y compris la quantité de mémoire utilisée.

De leur site ...

mémoire de profil pour comprendre comment votre application utilise la mémoire, et pour localiser fuites de mémoire. Le profileur de mémoire vous permet de prendre des instantanés à n'importe quel point lors de l'exécution de votre programme , vous pouvez donc voir quelle mémoire est en cours d'utilisation à ce stade. Vous pouvez prendre plusieurs instantanés à des moments différents pendant que votre application est en cours d'exécution, donc vous pouvez comparer la mémoire de l'application états.

+0

Je cherche en effet une implémentation programmatique. Mais je suis d'accord que le profileur ANTS peut certainement être utile dans les bonnes situations :) – Bullines

3

Sizeof peut être utilisé sur les types de valeur il y a aussi Marshal.SizeOf qui peut être utilisé avec des conseils pour .NET:

http://www.pixelicious.net/2008/07/03/exception-trying-to-get-the-size-of-a-c-class-using-marshalsizeof

Mais ... ce n'est pas exactement le total coût puisque l'exécution alloue des octets supplémentaires pour les classes pour des choses comme des blocs de synchronisation.

Si vous êtes vraiment intéressé à mesurer ce genre de chose, cependant, vous devez utiliser l'API de profilage:

http://msdn.microsoft.com/en-us/library/ms404386.aspx

Ou un outil gratuit comme windbg qui peut faire toutes sortes de choses merveilleuses.

1

Pas sans profileur. Il est assez difficile juste pour une seule classe - voir here.

2

Essayez la bibliothèque de débogage SOS. C'est le meilleur. Articles here et here

0

Merci pour les réponses. Je pense que mon plan d'attaque initial, car je suis sûr que la plupart des objets seront sérialisables, sera quelque chose comme ceci:

using (MemoryStream memstream = new MemoryStream()) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 

    try 
    { 
     formatter.Serialize(memstream, myObjectOfObjects); 
     mem_footprint += memstream.Length; 
    } 
    catch 
    { 
     // not a serializable object 
    } 
} 
Questions connexes