Получить размер байта List <T> - PullRequest
9 голосов
/ 30 ноября 2009

Глупый вопрос, но в приложении winforms, над которым я сейчас работаю, я хотел бы получить количество байтов, выделенных / используемых List<[SomeObject]>, хранящихся в памяти (для статистических целей). Это возможно? Я искал возможные варианты, но явно нет метода myList.GetTotalBytes().

Ответы [ 3 ]

11 голосов
/ 30 ноября 2009

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

Биты списка:

  • Резервный массив (T[] - ссылка на массив, к которому будет иметь доступ только список)
  • Размер (int)
  • Корень синхронизации (ссылка)
  • Номер версии (int)

Сложный вопрос - решить, сколько считать. Каждый из них довольно легко рассчитать (особенно если вы знаете, что, например, T является ссылочным типом), но хотите ли вы подсчитать объекты , на которые ссылается по списку? Эти ссылки единственные или нет?

Вы говорите, что хотите знать "для статистических целей" - не могли бы вы быть более точным? Если вы можете сказать, что вас действительно интересует (и немного больше информации о том, что находится в списке и могут ли быть другие ссылки на те же объекты), мы, вероятно, могли бы помочь больше.

7 голосов
/ 30 ноября 2009

Это может быть полный ответ, но я собираюсь выйти на конечность и сказать, что если вы делаете статистические сравнения, выполните двоичную сериализацию объекта в 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);
    }

Обратите внимание, что это может измениться между различными версиями платформы и будет полезно только для сравнения графов объектов в одной программе.

6 голосов
/ 30 ноября 2009

Я не уверен, что среда выполнения обеспечивает надежный программный метод получения размера объекта, однако есть несколько вариантов, открытых для вас:

  • используйте такой инструмент, как CLR Profiler
  • использование Marshal.SizeOf () (возвращает неуправляемый размер объекта)
  • сериализует ваш объект в двоичный файл для приближения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...