确定变量使用的字节数

时间:2011-02-02 07:40:09

标签: c# .net arrays memory-management

我有以下数组:

byte[][] A = new byte[256][];

此数组的每个元素都引用另一个数组。

A[n] = new byte[256];

但是,大多数元素引用相同的数组。实际上,数组A仅引用两个或三个唯一数组。

有没有一种简单的方法来确定整个事物使用多少内存?

3 个答案:

答案 0 :(得分:5)

如果你的问题是找出唯一的一维数组的数量,你可以这样做:

A.Distinct().Count()

这应该这样做,因为默认情况下数组的相等性在引用相等性上起作用。

但也许你正在寻找:

A.Distinct().Sum(oneDimArray => oneDimArray.Length) * sizeof(byte)

当然,“变量使用的字节数”是一个有点不精确的术语。特别是,上面的表达式没有考虑变量A的存储,锯齿数组中的引用,开销,对齐等。

编辑:正如Rob指出的那样,如果锯齿状数组可以包含它们,则可能需要过滤null个引用。

您可以使用(unsafe上下文)估算在锯齿状数组中存储引用的成本:

A.Length * sizeof(IntPtr) 

答案 1 :(得分:1)

我不相信有任何内置功能。<​​/ p>

很快就把它鞭打了,但是没有经过彻底的测试;

void Main()
{
    byte[][] a = new byte[256][];
    var someArr = new byte[256];
    a[0] = someArr;
    a[1] = someArr;
    a[2] = new byte[256];
    getSize(a).Dump();
}

private long getSize(byte[][] arr)
{
    var hashSet = new HashSet<byte[]>();
    var size = 0;
    foreach(var innerArray in arr)
    {
        if(innerArray != null)
            hashSet.Add(innerArray);
    }

    foreach (var array in hashSet)
    {
        size += array.Length * sizeof(byte);
    }
    return size;
}

答案 2 :(得分:1)

我只是修改了Rob的getSize方法来使用Buffer helper类。

private long getSize(byte[][] arr)
{
    Dictionary<byte[], bool> lookup = new Dictionary<byte[], bool>();

    long size = 0;

    foreach (byte[] innerArray in arr)
    {
        if (innerArray == null || lookup.ContainsKey(innerArray)) continue;
        lookup.Add(innerArray, true);
        size += Buffer.ByteLength(innerArray);
    }

    return size;
}