【问题标题】:How much memory instance of my class uses - pragmatic answer我的班级使用了多少内存实例 - 务实的答案
【发布时间】:2014-05-24 01:33:26
【问题描述】:
  1. 调用构造函数后,跟随类的实例有多大? 我想这通常可以写成 size = nx + c,其中 x = 4 在 x86 中,在 x64 中 x = 8。 n = ? c = ?
  2. .NET 中是否有一些方法可以返回这个数字?

class Node { 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】:

首先,这取决于程序编译和运行的环境,但如果你修复一些变量,你可以得到很好的猜测。

对 2) 的回答是否定的,对于作为参数给出的任何对象,没有任何函数可以为您提供请求的答案。

在解决 1) 时,您有两种方法:

  • 尝试执行一些测试以找出答案
  • 分析对象并进行数学运算

测试方法

先看看这些:

你需要的方法是这样的:

const int Size = 100000;
private static void InstanceOverheadTest()
{
    object[] array = new object[Size];
    long initialMemory = GC.GetTotalMemory(true);
    for (int i = 0; i < Size; i++)
    {
        array[i] = new Node();
    }
    long finalMemory = GC.GetTotalMemory(true);
    GC.KeepAlive(array);
    long total = finalMemory - initialMemory;
    Console.WriteLine("Measured size of each element: {0:0.000} bytes",
                      ((double)total) / Size);
}

在我的 Windows 7 机器上,VS 2012,.NET 4.5,x86(32 位)结果为 96.000。当更改为 x64 时,结果为 176.000。

做数学方法

数学方法可以写成一个函数,它会给你结果,但它是特定于你的 Node 类的,它只在对你的对象执行其他操作之前有效。另请注意,这是在 32 位程序中制作的,还请注意,此数字可能会随框架实现和版本而变化。这只是一个示例,如果对象足够简单,您如何在某个时刻对对象大小做出很好的猜测。数组和列表开销常量取自Overhead of a .NET array?C# List size vs double[] size

public const int PointerSize32 = 4;
public const int ValueArrayOverhead32 = 12;
public const int RefArrayOverhead32 = 16;
public const int ListOverhead32 = 32;
private static int instanceOverheadAssume32()
{
    int sa = RefArrayOverhead32 + 3 * PointerSize32;
    int sb = ValueArrayOverhead32 + 3 * sizeof(int);
    int sc = ListOverhead32;
    return 3 * PointerSize32 + sa + sb + sc;
}

这也将返回 96,所以我认为该方法是正确的。

【讨论】:

  • 为了显示数学方法的危险,我不会编辑答案。我刚刚意识到,在一些更复杂的情况下,两种方法之间存在差异,所以我做了更多的挖掘。首先,我在计算中没有考虑对象开销,但我将它与有关它的线程链接起来,以便您阅读。在我的例子中,对象增加了 12B,但是当对象有一些有用的成员时,这会减少到 8B。但这被错误的 ListOverhead32 补偿,当 List 为空时,它只有 24B,因为内部使用的数组尚未初始化。这种方法很容易出错,测量起来感觉更安全!
猜你喜欢
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
相关资源
最近更新 更多