Как улучшить производительность сборки мусора? - PullRequest
9 голосов
/ 04 октября 2008

Какие шаблоны оптимизации можно использовать для повышения производительности сборщика мусора?

Причина, по которой я спрашиваю, состоит в том, что я использую много встроенного программного обеспечения, используя Compact Framework. На медленных устройствах сборка мусора может стать проблемой, и я хотел бы сократить время запуска сборщика мусора, а когда это произойдет, я хочу, чтобы он завершился быстрее. Я также вижу, что работа с сборщиком мусора, а не против него, может помочь улучшить любое приложение .NET или Java, особенно тяжелые веб-приложения.

Вот некоторые из моих мыслей, но я не делал никаких тестов.

  • повторное использование временных классов / массивов (уменьшить количество выделенных ресурсов)
  • поддержание минимального количества живых объектов (более быстрые коллекции)
  • попробуйте использовать структуры вместо классов

Ответы [ 6 ]

12 голосов
/ 07 октября 2008

Ключ должен понять, как CF GC работает для распределений. Это простой GC, не относящийся к поколению, со специальными алгоритмами для того, что будет запускать GC и что будет вызывать уплотнение и / или качку после сбора. Практически ничего нельзя сделать на уровне приложения для управления сборщиком мусора (единственный доступный метод - это Collect, и его использование довольно ограничено, так как вы все равно не можете принудительно уплотнить).

Повторное использование объекта - хорошее начало, но простое поддержание низкого количества объектов, вероятно, является одним из лучших инструментов, поскольку для любой операции сбора необходимо пройти все корни. Короткая прогулка - хорошая идея. Если вас убивает сжатие, то поможет предотвращение фрагментации сегмента. Объекты> 64k могут быть полезны в этом отношении, поскольку они получают свой собственный сегмент и обрабатываются иначе, чем объекты меньшего размера.

Чтобы действительно понять, как работает CF GC, я бы порекомендовал посмотреть веб-трансляцию MSDN по управлению памятью CF .

3 голосов
/ 04 октября 2008

Самым важным аспектом является минимизация скорости распределения. Всякий раз, когда объект выделяется, он нуждается в GC позже. Теперь, конечно, если объект small или shortlived , он будет заколочен в молодом поколении (при условии, что GC является поколением). Крупные объекты, как правило, попадают прямо на арендованную арену. Но лучше вообще не собирать деньги.

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

Нужно остерегаться веса стандартных библиотек и фреймворков. Вы оберните пару объектов, и они заполнятся довольно быстро. Помните, что когда что-то идет в кучу GC, оно обычно использует немного больше места для GC-бухгалтерии. Таким образом, ваши 1000 указателей, выделенных по отдельности, намного больше, чем массив / вектор тех же указателей, поскольку последние могут совместно использовать GC-бухгалтерию. С другой стороны, последний, вероятно, останется в живых гораздо дольше.

2 голосов
/ 04 октября 2008

Другой вариант - вручную собрать мусор в непиковое время в вашем приложении с помощью GC.Collect () (при условии, что это доступно в CF). Это может уменьшить количество объектов, необходимых для очистки позже в вашем приложении.

2 голосов
/ 04 октября 2008

Проблема struct vs class является сложной ... вы можете легко использовать, например, lot больше стекового пространства. И вы, конечно, не хотите изменчивых структур. Но другие моменты кажутся разумными, если вы не изгибаете дизайн, чтобы приспособить его.

[править] Еще одна распространенная ошибка - конкатенация строк; если вы делаете конкатенацию в цикле, используйте StringBuilder, который удалит lot промежуточных строк. Может быть, GC занимается сбором всех заброшенных ветров ваших строк?

2 голосов
/ 04 октября 2008

Одним из важных фактов является как можно более короткий срок службы ваших объектов.

0 голосов
/ 04 октября 2008

Я слышал .NET Rocks шоу на Rotor 2.0 . Если вы действительно хардкор, вы можете скачать Rotor, настроить исходный код и использовать свой собственный модифицированный сборщик мусора.

В любом случае, у этого подкаста есть отличная информация о GC. Я настоятельно рекомендую послушать его.

...