Вопрос

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

Это было полезно?

Решение

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

  • используйте такой инструмент, как CLR Profiler
  • использование Маршал.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);
    }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top