获取List <T>的字节大小

Sha*_*lan 10 .net byte list winforms

愚蠢的问题,但在目前正在进行的winforms应用程序中,我想获得List<[SomeObject]>内存中保存的字节数量(用于统计目的).这可能吗?我通过可能的选项搜索,但显然没有myList.GetTotalBytes()方法.

Jon*_*eet 11

这真的取决于你的意思.您可以预测列表本身将使用多少字节 - 但这与预测在列表符合收集条件时可能有多少字节符合垃圾收集条件的情况不同.

列表的位:

  • 支持数组(T[]- 对只有列表才有权访问的数组的引用)
  • 大小(int)
  • 同步根(参考)
  • 版本号(int)

棘手的一点是决定计算多少.其中每个都很容易计算(例如,如果你知道T是一个引用类型),但是你想要计算列表引用的对象吗?那些参考文献是唯一的吗?

你说你想知道"出于统计目的" - 你能更准确吗?如果您可以说出您真正感兴趣的内容(以及有关列表中的内容以及是否可能存在对相同对象的其他引用的更多信息),我们可能会提供更多帮助.

  • 所以你想实际包含列表的所有元素,并且你会假设没有其他元素有引用?恐怕真的没有办法获得这些信息。 (2认同)

Jes*_*cer 7

这可能是一个充满马匹的答案,但是我会想出一个问题,并说如果你正在进行统计比较,那么将对象的二进制序列化为a 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);
    }
Run Code Online (Sandbox Code Playgroud)

请注意,这可能会在不同版本的框架之间发生变化,并且仅对单个程序中对象图之间的比较有用.

  • 一定不要忘记对强类型对象使用 [Serializable] (2认同)

fle*_*esh 6

我不确定运行时是否提供了获取对象大小的可靠编程方法,但是有一些选项可供您使用:

  • 使用像CLR Profiler这样的工具
  • 使用Marshal.SizeOf()(返回对象的非托管大小)
  • 将对象序列化为二进制以获得近似值