Недолговечные объекты - PullRequest
10 голосов
/ 10 марта 2009

Каковы затраты на создание большого количества временных объектов (т. Е. Для промежуточных результатов), которые "умирают молодыми" (никогда не переходят в следующее поколение в течение интервала сбора мусора)? Я предполагаю, что «новая» операция очень дешевая, так как на самом деле это просто приращение указателя. Тем не менее, каковы скрытые расходы, связанные с этим временным "мусором"?

Ответы [ 6 ]

13 голосов
/ 10 марта 2009

Не много - сборщик мусора очень быстр для gen0. Он также настраивает себя, регулируя размер gen0 в зависимости от того, сколько ему удается собирать каждый раз, когда он идет. (Если ему удастся собрать много, он уменьшит размер gen0 для сбора в следующий раз раньше, и наоборот.)

Окончательный тест - это как ваше приложение работает. Perfmon очень удобен здесь, показывая, сколько времени было проведено в GC, сколько коллекций было у каждого поколения и т. Д.

4 голосов
/ 10 марта 2009

Как вы говорите, само распределение очень недорого. Стоимость генерации большого количества недолговечных объектов - более частая сборка мусора, так как они запускаются, когда бюджет поколения 0 исчерпан. Тем не менее, коллекция поколения 0 довольно дешева, поэтому, пока ваш объект действительно недолговечен, накладные расходы, скорее всего, незначительны.

С другой стороны, общий пример объединения большого количества строк в цикле значительно увеличивает сборщик мусора, поэтому все зависит от количества создаваемых вами объектов. Не больно думать о распределении.

Стоимость сборки мусора заключается в том, что управляемые потоки приостанавливаются во время сжатия.

2 голосов
/ 10 марта 2009

В общем, это не то, о чем вам следует беспокоиться, и похоже, что оно начинает приближаться к «микрооптимизации». GC был разработан с предположением, что «хорошо настроенное приложение» будет иметь все свои выделения в Gen0 - это означает, что все они «умрут молодыми». Каждый раз, когда вы выделяете новый объект, он всегда находится в Gen0. Сбор не будет происходить до тех пор, пока не будет пройден порог Gen0 и в Gen0 не будет достаточно свободного места для хранения следующего выделения.

«Новая» операция - это на самом деле куча вещей:

  1. выделение памяти
  2. запуск конструктора типов
  3. возврат указателя на память
  4. увеличивает указатель на следующий объект
1 голос
/ 10 марта 2009

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

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

Вот статья из MSDN о том, как это работает: http://msdn.microsoft.com/en-us/magazine/bb985011.aspx

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

0 голосов
/ 10 марта 2009

Сборка мусора производится в .Net. Краткосрочные объекты будут собираться первыми и часто. Коллекция Gen 0 дешевая, но в зависимости от масштаба количества создаваемых вами объектов она может быть довольно дорогой Я бы запустил профилировщик, чтобы узнать, влияет ли это на производительность. Если это так, рассмотрите возможность переключения их на структуры. Их не нужно собирать.

0 голосов
/ 10 марта 2009

Если эти объекты никогда не продвигаются из поколения 0, то вы увидите довольно хорошую производительность. Единственная скрытая стоимость, которую я вижу, состоит в том, что если вы превысите свой бюджет поколения 0, вы заставите GC сжать кучу, но GC самонастроится, так что это не будет проблемой.

...