Определение количества байтов, используемых переменной - PullRequest
6 голосов
/ 02 февраля 2011

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

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

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

A[n] = new byte[256];

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

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

Ответы [ 3 ]

5 голосов
/ 02 февраля 2011

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

A.Distinct().Count()

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

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

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

Конечно, «количество байтов, используемых переменными» - это несколько неточный термин.В частности, вышеприведенное выражение не учитывает хранение переменной A, ссылки в зубчатом массиве, накладные расходы, выравнивание и т. Д.

РЕДАКТИРОВАТЬ: Как указывает Роб, вам может понадобиться фильтрация1012 * ссылается, если jagged-массив может содержать их.

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

A.Length * sizeof(IntPtr) 
1 голос
/ 02 февраля 2011

Я просто модифицировал метод Роба 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;
}
1 голос
/ 02 февраля 2011

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

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

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