Frage

Dumme Frage, aber in einer WinForms -App, an der ich gerade arbeite, möchte ich die Anzahl der von a benutzten Bytes zuweisen/verwendet List<[SomeObject]> im Gedächtnis gehalten (für statistische Zwecke). Ist das möglich? Ich habe durch die möglichen Optionen gesucht, aber es gibt offensichtlich keine myList.GetTotalBytes() Methode.

War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob die Laufzeit eine zuverlässige programmatische Methode für die Größe eines Objekts bietet. Für Sie stehen jedoch einige Optionen offen:

  • Verwenden Sie ein Werkzeug wie CLR -Profiler
  • verwenden Marshal.sizeof () (Gibt die nicht verwaltete Größe des Objekts zurück)
  • Serialisieren Sie Ihr Objekt für eine Näherung mit Binär

Andere Tipps

Es hängt wirklich davon ab, was Sie meinen. Sie können vorhersagen, wie viele Bytes von der Liste selbst verwendet werden - aber das ist nicht dasselbe wie die Vorhersage, wie viele Bytes möglicherweise für die Müllsammlung in Frage kommen, wenn die Liste für die Sammlung in Frage kommt.

Teile der Liste:

  • Das Backing -Array (T[] - Ein Verweis auf ein Array, auf den nur die Liste zugreifen wird)
  • Die Größe (int)
  • Eine Synchronisation (Referenz)
  • Die Versionsnummer (int)

Das knifflige Stück ist, wie viel zu zählen ist. Jede davon ist ziemlich einfach zu berechnen (insbesondere wenn Sie wissen, dass T zum Beispiel ein Referenztyp ist), möchten Sie jedoch die Objekte zählen verwiesen nach der Liste? Sind diese Referenzen die einzigen oder nicht?

Sie sagen, Sie möchten "für statistische Zwecke" wissen - könnten Sie genauer sein? Wenn Sie sagen können, woran Sie wirklich interessiert sind (und ein bisschen mehr Informationen darüber, was sich in der Liste befindet und ob es andere Verweise auf dieselben Objekte gibt), könnten wir wahrscheinlich mehr helfen.

Dies mag eine vollständige Antwort sein, aber ich werde auf das Glied gehen und sagen, wenn Sie statistische Vergleiche durchführen, machen Sie eine binäre Serialisierung des Objekts zu a MemoryStream Und dann schauen Sie sich das an Length Eigentum als solches:

    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);
    }

Beachten Sie, dass sich dies zwischen verschiedenen Versionen des Frameworks ändern könnte, und wäre nur für Vergleiche zwischen Objektgraphen innerhalb eines einzelnen Programms nützlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top