【问题标题】:Get byte size of List<T>获取 List<T> 的字节大小
【发布时间】:2009-11-29 22:22:36
【问题描述】:

愚蠢的问题,但在我目前正在开发的 winforms 应用程序中,我想获取内存中保存的 List&lt;[SomeObject]&gt; 分配/使用的字节数(用于统计目的)。这可能吗?我已经搜索了可能的选项,但显然没有myList.GetTotalBytes() 方法。

【问题讨论】:

    标签: .net winforms list byte


    【解决方案1】:

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

    列表的位:

    • 后备数组(T[] - 对只有列表才能访问的数组的引用)
    • 大小(整数)
    • 同步根目录(参考)
    • 版本号 (int)

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

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

    【讨论】:

    • 嗨,乔恩,感谢 4 的回复。抱歉 4 不是很清楚。 List 是从 LINQ 查询中填充的表实体的集合。而这个主要包含字符串和日期时间类型。
    • “用于统计目的” - 假设我的查询产生了一个包含 10,000 个实体对象的集合,并且(假设我可以更好地计算)每个对象平均占用 25 个字节的内存,我想得到List 中所有 Entity 对象的累积字节总数
    • 如前所述,我正在寻找一种替代方法来遍历对象并深入研究每个属性,正如 Jan 也提到的那样
    • 所以您想实际包含列表的所有元素,并且您会假设没有其他任何参考?恐怕真的没有办法获得这些信息。
    【解决方案2】:

    这可能是一个充满挑战的答案,但我会冒昧地说,如果您要进行统计比较,请将对象的二进制序列化为 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);
        }
    

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

    【讨论】:

    • 一定不要忘记对强类型对象使用 [Serializable]
    【解决方案3】:

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

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

    【讨论】:

    • 哇,真快!谢谢4回复!不幸的是,我正在寻找一种在运行时可用的方法,希望这不会涉及我将列表拆开并遍历每个对象。
    • 没有提到 CLR Profiler。以前从未使用过它,但谢谢你 - 我会去阅读更多关于使用它的内容!
    猜你喜欢
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2017-09-18
    • 2011-03-22
    • 1970-01-01
    • 2013-08-23
    • 2015-11-20
    相关资源
    最近更新 更多