【问题标题】:How much bytes instance of my class uses? [duplicate]我的班级实例使用了多少字节? [复制]
【发布时间】:2014-05-22 10:55:09
【问题描述】:
  1. 调用构造函数后,跟随类的实例有多大? 我想这通常可以写成 size = nx + c,其中 x = 4 在 x86 中,在 x64 中 x = 8。 n = ? c = ?
  2. .NET 中是否有一些方法可以返回这个数字?
{
    byte[][] a;
    int[] b;
    List<Node> c;
    public Node()
    {
        a = new byte[3][];
        b = new int[3];
        c = new List<Node>(0);
    }
}

【问题讨论】:

标签: c# .net memory-management micro-optimization


【解决方案1】:

没有单一的公式可以计算这一点。它很大程度上取决于硬件、操作系统、平台、框架版本、Windows 版本等。每个对象还有一堆与之相关的东西——指向类型、方法、线程、应用程序域、内存地址、syncroot 对象的指针锁定。所以没有100%准确的测量。

这将为您提供一个下限。你的实际对象会稍微多一些。

还有其他计算方法,例如使用 Interops,但归根结底,他们也只会给出估计值(参见 How to get object size in memory?Find size of object instance in bytes in c#)。

所以估计,在我的机器上(x64,为任何 CPU 编译,作为 x64 位进程运行,Windows Server 2012 R2,.NET 4.5)这是

[Serializable]
class Node
{
    byte[][] a;
    int[] b;
    List<Node> c;
    public Node()
    {
        a = new byte[3][];
        b = new int[3];
        c = new List<Node>(0);
    }
}

[Test]
public void GetSize()
{    
    Node item = new Node();
    object o = new object();
    long size = 0;
    using (Stream s = new MemoryStream())
    {
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(s, item);
        size = s.Length; // <<<<<  918 bytes on my machine
    }
}

【讨论】:

  • 我会做一些实验,如果这么大,我需要重新考虑这门课。我对数组/列表大小比率非常感兴趣。
  • 两个有趣的踏板,看不出这怎么能总结为 918B。我将进行类似的测量。 stackoverflow.com/questions/1589669/overhead-of-a-net-arraystackoverflow.com/questions/1508215/…
  • 抱歉,您的号码折扣超过 400%,请查看stackoverflow.com/questions/22986431/…
  • @watbywbarif 你是一个很好奇的头脑;)。对您的评论的回答是您使用了不同的测量技术。我不认为它代表“真正的”价值。另一方面,二进制序列化也可能会添加一些序列化cmets。所以我会选择任何方法,然后就用它。并接受它并不完美。
  • @watbywbarif 恕我直言,这是一个复杂的问题,我不确定我是否足够聪明来回答这个问题。我会选择任何方法(GC、序列化、互操作、查看 clr 调试器......)并使用它。我不太喜欢这个理论。在实践中,这仅在达到内存限制时才算,另一种情况是特定算法太慢。在第一个中,我会考虑水平扩展和使用内存分布式数据库。在第二个中,我想选择一个不同的更快的算法或数据结构。理论上/“真实”的内存消耗对我来说很难。我喜欢问题...
猜你喜欢
  • 2014-05-24
  • 1970-01-01
  • 2012-09-13
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2016-06-30
相关资源
最近更新 更多