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 () .

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top