Dumme Frage, aber in einer Winforms App Im derzeit arbeiten, würde ich gerne die Menge der Bytes von einem List<[SomeObject]>
im Speicher gehalten (für statistische Zwecke) verwendet. Ist das möglich? Ich habe durch die möglichen Optionen gesucht, aber es gibt offensichtlich keine myList.GetTotalBytes()
Methode.Get Byte-Größe der Liste <T>
Antwort
Ich bin nicht sicher, der Laufzeit eine zuverlässige programmatische Methode bietet jedoch die Größe eines Objekts zu bekommen gibt es einige Optionen offen:
- ein Tool wie CLR Profiler verwenden
- Verwendung Marshal.SizeOf() (Retouren die nicht verwaltete Größe des Objekts)
- serialisiert Ihr Objekt binary für eine Annäherung
Es hängt wirklich davon ab, was Sie meinen. Sie können vorhersagen, wie viele Bytes von der Liste selbst verwendet werden. Dies ist jedoch nicht dasselbe wie die Voraussage, wie viele Bytes möglicherweise für die Garbage Collection verfügbar sind, wenn die Liste für die Erfassung infrage kommt.
Bits der Liste:
- Die Trägeranordnung (
T[]
- eine Referenz auf ein Array, das nur die Liste Zugriff haben wird) - die Größe (int)
- A sync Wurzel (Referenz)
- Die Versionsnummer (int)
Der schwierige Bit ist zu entscheiden, wie viel zu zählen. Jeder von diesen ist ziemlich einfach zu berechnen (besonders wenn Sie wissen, dass T ein Referenztyp ist, zum Beispiel), aber möchten Sie die Objekte referenziert von der Liste zählen? Sind diese Referenzen die einzigen, oder nicht?
Sie sagen, dass Sie "für statistische Zwecke" wissen wollen - könnten Sie genauer sein? Wenn Sie sagen können, woran Sie wirklich interessiert sind (und ein bisschen mehr Informationen darüber, was in der Liste steht und ob es andere Referenzen auf dieselben Objekte geben könnte), könnten wir wahrscheinlich mehr helfen.
Hallo Jon, und danke die Antwort. Entschuldigung 4 ist nicht sehr klar. Die Liste ist eine Sammlung von Tabellenentitäten, die aus einer LINQ-Abfrage gefüllt werden. Und dieser enthält hauptsächlich String- und DateTime-Typen. – Shalan
"für statistische Zwecke" - nehmen wir an, meine Abfrage ergibt eine Sammlung mit 10.000 Entity-Objekten, und (vorausgesetzt, ich kann dies besser berechnen) jedes Objekt belegt im Durchschnitt 25 Bytes Speicher, möchte ich die kumulative Bytes Summe aller Entity Objekte in der Liste – Shalan
Wie bereits erwähnt, bin ich auf der Suche nach einer Alternative zum Iterieren durch die Objekte und Bohren bis zu jeder Eigenschaft, wie auch von Jan erwähnt – Shalan
Dies kann eine voll-Pferd-Gucky-Antwort sein, aber ich werde auf ein Bein und sagen, wenn Sie tun, statistische Vergleiche, tun eine binäre Serialisierung des Objekts zu einem MemoryStream
und dann Blick auf seine Length
Eigenschaft als solche:
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 diese zwischen den verschiedenen Versionen des Frameworks ändern könnte und würde nur nützlich für Vergleiche zwischen den Objektgraphen in einem einzigen Programm.
woah, das war schnell! danke 4 die Antwort! Leider suche ich nach einer Methode, die zur Laufzeit verfügbar ist, und hoffentlich nicht etwas, das mich dazu bringt, die Liste auseinander zu reißen und durch jedes Objekt zu iterieren. – Shalan
verpasste die Erwähnung des CLR Profilers. Habe es noch nie benutzt, aber danke dafür - ich werde noch ein bisschen mehr darüber lesen! – Shalan