Поиск

Совершенное решение

Согласитесь, что совершенное решение этой проблемы — создать систему, в которой каждый объект не требует много памяти, его легко использовать и восстанавливать. В такой идеальной системе каждый объект сразу, как только программист сочтет, что объект больше не нужен (независимо от того, существуют ли циклы), удаляется детерминированным упорядоченным способом. Посвятив бессчетное количество часов решению этой проблемы, команда разработчиков .NET считает, что это можно сделать, лишь комбинируя трассирующий GC со счетчиком ссылок. Данные теста говорят, что подсчет ссылок требует слишком больших затрат ресурсов, чтобы использовать его при решении задач общего назначения для всех объектов среды программирования. Вложенность кода, сам код и данные при этом больше. Если затем прибавить к этим и без того высоким затратам ресурсов дополнительную стоимость реализации трассирующего сборщика для обработки циклов, то станет ясно, какую непомерную цену приходится платить за управление памятью.

На заре разработки .NET были исследованы различные методы, чтобы отыскать способ улучшения производительности подсчета ссылок. До этого уже были созданы системы на основе счетчика ссылок с приемлемой производительностью. Увы, после изучения литературы стало ясно, что повышение производительности в подобных системах достигалось за счет снижения их детерминированности.

С другой стороны, замечу, что для программ на С++/СОМ это не проблема. Там, где от программиста требуется явное управление памятью, самые производительные С++-программы, использующие СОМ, внутренне применяют классы C++. Программисты на C++ в общем случае используют СОМ, только чтобы создавать клиентские интерфейсы. Это ключевая характеристика, обеспечивающая высокую производительность этих программ. Но это, очевидно, не задача .NET, где связанные с управлением памятью вопросы должны решаться GC, а не программистом.