Глупый вопрос, но в приложении winforms, над которым я сейчас работаю, я хотел бы получить количество байтов, выделенных / используемых List<[SomeObject]>
в памяти (для статистических целей). Это возможно? Я просмотрел возможные варианты, но метода myList.GetTotalBytes()
явно не существует.
3 ответа
Я не уверен, что среда выполнения предоставляет надежный программный метод получения размера объекта, однако для вас есть несколько вариантов:
- используйте такой инструмент, как CLR Profiler
- используйте Marshal.SizeOf () ( возвращает неуправляемый размер объекта)
- сериализуйте свой объект в двоичный код для приближения
Это действительно зависит от того, что вы имеете в виду. Вы можете предсказать, сколько байтов будет использовано самим списком, но это не то же самое, что спрогнозировать, сколько байтов может быть допущено к сборке мусора, если список станет пригодным для сбора.
Биты списка:
- Резервный массив (
T[]
- ссылка на массив, к которому будет иметь доступ только список) - Размер (int)
- Корень синхронизации (ссылка)
- Номер версии (int)
Сложность состоит в том, чтобы решить, сколько считать. Каждый из них довольно легко вычислить (особенно если вы знаете, что T является ссылочным типом, например), но хотите ли вы подсчитать объекты, на которые ссылаются в списке? Эти ссылки единственные или нет?
Вы говорите, что хотите знать «для статистических целей» - не могли бы вы быть более точными? Если вы можете сказать, что вас действительно интересует (и немного больше информации о том, что находится в списке и могут ли быть другие ссылки на те же объекты), мы, вероятно, могли бы помочь больше.
Это может быть ответ, полный коня, но я рискну и скажу, что если вы проводите статистические сравнения, выполните двоичную сериализацию объекта в MemoryStream
, а затем посмотрите на его свойство Length
как таковое:
List<string> list = new List<string>
{
"This",
"is",
"a",
"test"
};
using (Stream stream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, list);
Console.WriteLine(stream.Length);
}
Обратите внимание, что это может меняться между разными версиями фреймворка и будет полезно только для сравнения графов объектов в рамках одной программы.
Похожие вопросы
Новые вопросы
.net
НЕ используйте для вопросов о .NET Core - используйте вместо этого [.net-core]. .NET Framework - это программная среда, предназначенная главным образом для операционной системы Microsoft Windows. Он включает в себя реализацию библиотеки базовых классов, общеязыковой среды выполнения (обычно называемой CLR), общей системы типов (обычно называемой CTS) и динамической среды исполнения. Он поддерживает множество языков программирования, включая C #, VB.NET, F # и C ++ / CLI.