Здесь приведено довольно много разных аргументов. Я хочу начать с пояснения, что вы не можете сделать сравнение 1: 1. У каждого есть свои плюсы и минусы, и любой фрагмент кода будет более подходящим для той или иной системы. Напротив, это означает, что вы должны знать, имеете ли вы GC или нет для написания эффективного кода.
Мой аргумент вы должны знать свою среду и код соответственно . Это сделает ваш код эффективным. Переход от одной парадигмы к другой и кодирование того же стиля сделают ваш код более неэффективным, чем то, что GC действительно помогает / убирает.
Корпус:
Программа выделяет тысячи кучи памяти для недолговечных объектов. То есть многократно выделяет и освобождает объекты разного размера.
В среде без GC для каждого выделения вы в конечном итоге вызываете malloc, что требует поиска в списке свободных фрагментов памяти наиболее подходящего (в соответствии с конкретной реализацией malloc). Память используется, а затем освобождается бесплатно [или new / delete в C ++ ...]. Стоимость управления памятью - это стоимость размещения фрагментов.
В среде GC с подвижным GC, как java или .net, после каждого запуска GC вся свободная память является непрерывной. Стоимость приобретения памяти для объекта дешевая, действительно дешевая (инструкции <10 cpu в Java VM). При каждом запуске GC только живые объекты находятся и перемещаются в начало соответствующей области памяти (обычно это другая область, чем исходная). Стоимость управления памятью - это, прежде всего, стоимость перемещения всех достижимых (живых) объектов. Теперь предпосылка состоит в том, что большинство объектов недолговечны, поэтому в итоге стоимость может быть меньше, чем у системы без GC. Один миллион объектов, выделенных и освобожденных (забытых) за один прогон ГХ, не требует дополнительных затрат. </p>
Вывод: в языках GC вы можете создавать все локальные объекты в куче. Они дешевые. С другой стороны, в системах без GC куча распределений, освобождений и новых распределений является дорогостоящей. Память фрагментирована, и стоимость malloc возрастает ... В системах без GC вы должны максимально использовать стек, используя ненужную кучу.
Это имеет другое значение. Люди, привыкшие к одной из двух систем памяти, будут склонны писать неэффективные программы в другой. Они используются для некоторых идиом, которые, вероятно, плохи в другой системе.
Наглядным примером является неуправляемый программист, который используется для выделения объекта и повторного использования (для сброса его внутренних указателей с новыми элементами по мере необходимости) используется такой способ мышления: распределение дорого, повторное использование дешево. Теперь, если тот же самый точный код перемещен в среду GC поколений (Java, .net - оба являются Move-generational-GC), вы получите забавный эффект. В Java поколения GC система будет выполнять второстепенные коллекции только для младших поколений, обрабатывая только старшие поколения в полных коллекциях. Но объект в молодом поколении может упоминаться объектами в старшем поколении, поэтому необходимо выполнить дополнительную работу, чтобы отследить эти ссылки от старого к молодому. В частности, в сборщик мусора Java 1.4.1 система пометит карту памяти (часть страницы), где находится старый объект, и затем включит все отмеченные карты для обработки во время второстепенного сбора, эффективно увеличивая объем работы, которую должен выполнять GC и, возможно, влияющий на производительность.
Объект был жив во время 1, 2, 3 ... запусков ГХ, и его много раз перемещали, в конце концов перемещают в старое поколение, где его не будут перемещать при каждом прогоне ГК, а можно просто стоять там ... но увы, программист заставляет объект становиться моложе. Он перемещается еще раз и будет снова перемещаться каждый раз, когда GC подходит к тому моменту, когда он снова становится старым.
Чтобы провести разумное сравнение, вам нужно, чтобы программисты, знакомые с этой средой, написали различных фрагментов кода, которые решают одну и ту же проблему с помощью одних и тех же алгоритмов с различными взглядами на управление памятью. Затем сравните результаты обоих из них.