суббота, 23 февраля 2019 г.

Go FAQ: Зачем создавать коллекцию мусора? Не слишком ли это дорогая операция?

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

Большая часть сложности конкурентного программирования имеет корни в проблеме времени жизни объекта: когда объекты передаются между потоками, становится сложно гарантировать что ресурсы благополучно освободились. Автоматическая сборка мусора значительно упрощает написание конкурентного кода. Конечно, реализация сборки мусора в конкурентной среде сама по себе является вызовом для разработчика, но встретить его один раз и справиться с ним однажды, а не в каждой программе, поможет всем.

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

Нельзя сказать, что недавние работы в языках как Rust, которые привносят новые идеи в проблему управления ресурсами, вводит в заблуждение. Но Go использует более традиционный подход, обращаясь к времени жизни объекта через коллекцию мусора и только через коллекцию мусора.

Текущая реализация представляет собой сборщик меток и разверток (mark-and-sweep collector). Если машина является многопроцессорной, коллектор работает на отдельном процессорном ядре параллельно с основной программой. Большая работа над коллектором в последние годы сократила время пауз, часто с точностью до миллисекунды, даже для больших куч (heaps), почти исключая одно из основных возражений против сбора мусора в сетевых серверах. Продолжается работа по уточнению алгоритма, дальнейшему снижению накладных расходов и задержки.

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


Читайте также:


Комментариев нет:

Отправить комментарий