Подтвердить что ты не робот

.NET: Какова типичная накладная сборщик мусора?

5% времени выполнения, затраченного на GC? 10%? 25%?

Спасибо.

4b9b3361

Ответ 1

Как говорили другие, это зависит. Но, просто для вашего чтения:

Кроме того, мой вопрос к вам будет: почему вы беспокоитесь о накладных расходах (или вам просто интересно с академической точки зрения)? Если есть определенная ситуация, по которой вы думаете, что сборщик мусора повлияет на производительность вашего приложения, пожалуйста, спросите об этой ситуации, и вы сможете получить более качественные ответы. В противном случае есть более важные вещи, о которых можно беспокоиться (с точки зрения производительности), чем сборщик мусора - первый из них - ваш собственный код/​​алгоритмы и т.д.

Ответ 2

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

Он может даже упасть до 0%, если вы выделите все до начала и никогда не выделяете никаких новых объектов.

В типичных приложениях я думаю, что ответ очень близок к тому, что 0% времени тратится на сборщик мусора.

Ответ 3

Смотрите видеоролик Red Gate здесь. Лучшее объяснение GC, с которым я столкнулся.

Ответ 4

В этом сообщении в блоге есть интересное исследование в этой области.

Вывод плакатов? Что накладные расходы были незначительными для его примера.

Итак, куча GC настолько быстра, что в реальной программе, даже в жестких циклах, вы можете использовать закрытие и делегаты, даже не задумываясь о ней (или даже о нескольких наносекундах). Как всегда, работайте над чистой, безопасной конструкцией, затем с профилем, чтобы узнать, где накладные расходы.

Ответ 5

Накладные расходы сильно различаются. Практически невозможно свести предметную область к "типичным сценариям", поскольку накладные расходы на GC (и связанные функции, такие как завершение) зависят от нескольких факторов:

  • ГХ-вкус, который использует ваше приложение (влияет на то, как ваши потоки могут быть заблокированы во время GC).
  • Профиль распределения, в том числе, как часто вы выделяете (GC триггеры автоматически, когда запрос на распределение требуется больше памяти) и профиль жизни объектов (коллекции gen 0 быстрей, коллекции 2-го поколения медленнее, если вы вызываете много общего 2 коллекции увеличивают ваши накладные расходы.)
  • Профиль жизни конечных объектов, поскольку они должны иметь свои финализаторы до того, как они будут доступны для сбора.

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

В принципе, как говорили другие, это зависит. Или "достаточно низко, чтобы вы не беспокоились об этом, пока он не появится в отчете профилировщика".

Ответ 6

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

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

Кроме того, начиная с .Net 4 сборщик мусора много работает над другим потоком, который не прерывает ваш текущий код. Поскольку мы все больше и больше работаем с машинами с чересчурным ядром, где ядро ​​может иногда сидеть без дела, это очень важно.

Ответ 7

В родном C/С++ иногда бывает большая стоимость выделения памяти из-за нахождения блока свободной памяти, имеющего нужный размер, также нет никакой стоимости освобождения памяти из-за чтобы связать освобожденную память с правильным списком блоков и объединить небольшие блоки в большие блоки.

В .NET очень быстро выделить новый объект, но вы платите стоимость, когда работает сборщик мусора. Однако стоимость уборки мусора недолговечный объект как можно ближе к вам.

Я всегда обнаружил, что если стоимость сбора мусора является для вас проблемой, тогда у вас, вероятно, возникнут более серьезные проблемы с дизайном вашего программного обеспечения. Пейджинг может быть большой проблемой для любого GC, если у вас нет достаточной физической памяти, поэтому вы не сможете просто поместить все свои данные в ОЗУ и зависеть от ОС для обеспечения виртуальной памяти по мере необходимости.