Определение количества байтов, используемых переменной
у меня есть следующий массив:
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;
}