Ottieni la dimensione in byte di Elenco < T >
Domanda
Domanda sciocca, ma in un'app Winforms su cui sto attualmente lavorando, vorrei ottenere la quantità di byte allocati / utilizzati da un List < [SomeObject] >
tenuto in memoria (per statistica scopi). È possibile? Ho cercato tra le possibili opzioni, ma ovviamente non esiste alcun metodo myList.GetTotalBytes ()
.
Soluzione
Non sono sicuro che il runtime fornisca un metodo programmatico affidabile per ottenere le dimensioni di un oggetto, tuttavia ci sono alcune opzioni aperte:
- usa uno strumento come CLR Profiler
- usa Marshal.SizeOf () (restituisce la dimensione non gestita dell'oggetto)
- serializza il tuo oggetto su binario per un'approssimazione
Altri suggerimenti
Dipende davvero da cosa intendi. Puoi prevedere quanti byte verranno utilizzati dall'elenco stesso, ma non è lo stesso che prevedere quanti byte potrebbero essere idonei per la garbage collection se l'elenco diventasse idoneo per la raccolta.
Bit dell'elenco:
- La matrice di supporto (
T []
- un riferimento a una matrice a cui solo l'elenco avrà accesso) - La dimensione (int)
- Una radice di sincronizzazione (riferimento)
- Il numero di versione (int)
Il trucco è decidere quanto contare. Ognuno di questi è abbastanza facile da calcolare (in particolare se si sa che T è un tipo di riferimento, ad esempio) ma si desidera contare gli oggetti referenziati dall'elenco? Questi riferimenti sono gli unici o no?
Dici di voler conoscere " a fini statistici " - potresti essere più preciso? Se puoi dire a cosa sei veramente interessato (e un po 'più di informazioni su cosa c'è nella lista e se ci possono essere altri riferimenti agli stessi oggetti), potremmo probabilmente aiutare di più.
Questa potrebbe essere una risposta piena di enigmi, ma ho intenzione di uscire su un arto e dire che se stai facendo confronti statistici, esegui una serializzazione binaria dell'oggetto in un MemoryStream
e quindi guarda la sua proprietà Length
come tale:
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);
}
Si noti che ciò potrebbe cambiare tra le diverse versioni del framework e sarebbe utile solo per confronti tra grafici di oggetti all'interno di un singolo programma.