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

有帮助吗?

解决方案

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

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

其他提示

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

列表的位:

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

棘手的一点是决定要计数多少。其中每一个都相当容易计算(例如,特别是如果您知道 T 是引用类型),但是您想对对象进行计数吗 引用的 按清单?这些参考文献是唯一的吗?

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

这可能是一个充满马匹的答案,但是我要说出来,如果你正在进行统计比较,那就把对象的二进制序列化做到 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);
    }

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top