2009-11-29 45 views
6

愚蠢的问题,但在目前正在处理的WinForms应用程序中,我希望获得内存中保存的List<[SomeObject]>分配/使用的字节数(用于统计目的)。这可能吗?我已经通过可能的选项进行了搜索,但显然没有myList.GetTotalBytes()方法。获取列表的字节大小<T>

回答

5

我不知道在运行时提供获取对象的大小的一个可靠的编程方法,但也有一些选项开放给你:

  • 使用的工具,像CLR探查
  • 使用Marshal.SizeOf()(返回对象的非托管大小)
  • 序列化你的对象为二进制的近似
+0

哇,那很快!谢谢4回复!不幸的是,我正在寻找一种在运行时可用的方法,并且希望不会涉及到将列表拆分并迭代每个对象。 – Shalan 2009-11-29 22:27:48

+0

错过了CLR Profiler的提及。以前从未使用过,但感谢 - 即时阅读更多关于使用它! – Shalan 2009-12-02 01:27:50

10

这真的取决于你的意思。您可以预测列表本身将使用多少字节 - 但这与预测有多少字节可能符合垃圾回收条件(如果该列表符合收集条件)不同。列表的

位:

  • 背衬阵列(T[] - 到数组的引用仅列表将有权访问)
  • 大小(INT)
  • 一个同步根(参考)
  • 版本号(INT)

棘手位是决定多少算。其中每一个都很容易计算(特别是如果你知道T是一个参考类型,例如),但是你想计算清单中引用的对象?那些引用是唯一的,还是不是?

你说你想知道“出于统计目的” - 你能更精确吗?如果你能说出你真正感兴趣的内容(以及关于列表中的内容的更多信息以及是否可能有其他对同一对象的引用),我们可能会帮助更多。

+0

嗨乔恩,并thanx 4的答复。抱歉4不太清楚。该列表是从LINQ查询中填充的表实体的集合。而这个主要包含string和dateTime类型。 – Shalan 2009-11-29 22:38:14

+0

“用于统计目的” - 可以说我的查询产生一个包含10,000个实体对象的集合,并且(假设我可以更好地计算)每个对象占用平均25个字节的内存,我希望获得所有实体对象在列表 – Shalan 2009-11-29 22:42:34

+0

正如前面提到的,我正在寻找一种替代方法来迭代通过对象并向下钻取到每个属性,也如Jan – Shalan 2009-11-29 22:44:17

4

这可能是一个完整的马,pucky答案,但我要去无路可退,并说,如果你正在做的统计比较,执行对象的二进制序列化到一个MemoryStream,然后看它的Length财产如:

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

注意到,这可能不同版本的框架之间,改变将仅适用于单个程序中的对象图之间的比较是有用的。