Определение количества байтов, используемых переменной

у меня есть следующий массив:

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

каждый элемент этого массива ссылается на другой массив.

A[n] = new byte[256];

однако большинство элементов ссылаются на один и тот же массив. Фактически, массив A ссылается только на два или три уникальных массива.

есть ли простой способ определить, сколько памяти использует вся вещь?

3 ответов


если ваш вопрос состоит в том, чтобы узнать количество уникальных массивов 1D, вы можете сделать:

A.Distinct().Count()

это должно сделать, потому что равенство массивов работает на ссылочном равенстве по умолчанию.

но, возможно, вы ищете:

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

конечно, "количество байтов, используемых переменными" является несколько неточным термином. В частности, приведенное выше выражение не учитывает хранение переменной A, ссылки в зубчатом массиве, накладные расходы, выравнивание так далее.

EDIT: как указывает Роб, вам может потребоваться фильтровать null ссылки, если jagged-array может содержать их.

вы можете оценить стоимость хранения ссылок в jagged-array с помощью (unsafe контекст):

A.Length * sizeof(IntPtr) 

Я не верю, что есть какие-либо встроенные функции.

взбитые это очень быстро, не протестировали его до конца, однако;

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;
}

Я просто модифицированный метод getSize Роба для использования вспомогательного класса Buffer.

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;
}