Я читал во многих местах (черт, я даже написал так себе) , что сбор мусора может (теоретически) быстрее , чем ручное управление памятью.
Однако показать гораздо сложнее, чем рассказать.
Я никогда не видел ни одного куска кода, который демонстрирует этот эффект в действии.
Кто-нибудь есть (или знает, где я могу найти) код, который демонстрирует это преимущество в производительности?
memory
garbage-collection
Mehrdad
источник
источник
Ответы:
См. Http://blogs.msdn.com/b/ricom/archive/2005/05/10/416151.aspx и перейдите по всем ссылкам, чтобы увидеть, как Рико Мариани против Раймонда Чена (оба очень компетентных программиста в Microsoft) сражаются друг с другом. , Раймонд улучшит неуправляемый, Рико ответит, оптимизировав то же самое в управляемых.
Практически без усилий по оптимизации управляемые версии начинались во много раз быстрее, чем руководство. В конечном итоге руководство превзошло управляемое, но только путем оптимизации до уровня, к которому большинство программистов не хотели бы идти. Во всех версиях использование памяти в руководстве было значительно лучше, чем в управляемой.
источник
swap
) не так уж сложно, и, вероятно, приведет вас к этому довольно легко с точки зрения производительности ...Правило большого пальца заключается в том, что бесплатных обедов не бывает.
GC снимает головную боль при ручном управлении памятью и снижает вероятность ошибок. В некоторых ситуациях определенная стратегия GC является оптимальным решением проблемы, и в этом случае вы не будете платить штраф за ее использование. Но есть и другие, где другие решения будут быстрее. Поскольку вы всегда можете смоделировать более высокие абстракции с более низкого уровня, но не наоборот, вы можете эффективно доказать, что в общем случае более высокие абстракции не могут быть быстрее, чем более низкие.
GC - это особый случай ручного управления памятью
Чтобы повысить производительность вручную, может потребоваться много работы или больше ошибок, но это уже другая история.
источник
Легко построить искусственную ситуацию, когда GC бесконечно более эффективен, чем ручные методы - просто договориться, что для сборщика мусора есть только один «корень», и что все является мусором, поэтому шаг GC мгновенно завершается.
Если подумать, это модель, используемая при сборке мусора памяти, выделенной для процессов. Процесс умирает, вся его память - мусор, все готово. Даже в практическом плане процесс, который запускается, запускается и умирает, не оставляя следов, может быть более эффективным, чем процесс, который запускается и работает вечно.
Для практических программ, написанных на языках с сборкой мусора, преимуществом сборки мусора является не скорость, а правильность и простота.
источник
abort()
в C ++ до выхода из программы. Это бессмысленное сравнение; вы даже не собираете мусор, вы просто позволяете утечке памяти. Вы не можете сказать, что сборка мусора происходит быстрее (или медленнее), если вы не собираете мусор для начала ...Следует учитывать, что GC - это не просто стратегия управления памятью; он также предъявляет требования ко всему дизайну языка и среды выполнения, что влечет за собой затраты (и выгоды). Например, язык, который поддерживает GC, должен быть скомпилирован в форму, в которой указатели не могут быть скрыты от сборщика мусора, и, как правило, там, где они не могут быть построены, за исключением тщательно управляемых системных примитивов. Еще одним соображением является сложность поддержания гарантий времени отклика, поскольку GC налагает некоторые шаги, которые должны быть выполнены до завершения.
Следовательно, если у вас есть язык для сборки мусора, и вы сравниваете скорость с памятью, управляемой вручную, в той же системе, вам все равно придется платить дополнительные расходы на поддержку сбора мусора, даже если вы его не используете.
источник
Быстрее сомнительна. Однако он может быть сверхбыстрым, незаметным или быстрым, если поддерживается аппаратное обеспечение. Подобные конструкции были для машин LISP давным-давно. Один встроил GC в подсистему памяти аппаратного обеспечения таким образом, чтобы основной процессор не знал, что он там находится. Как и во многих более поздних разработках, сборщик мусора работал одновременно с основным процессором, практически без необходимости делать паузы. Более современный дизайн - это машины Azul Systems Vega 3, которые выполняют Java-код намного быстрее, чем JVM, использующие специализированные процессоры и GC без пауз. Найдите их, если хотите знать, насколько быстрым может быть GC (или Java).
источник
Я проделал довольно много работы над этим и описал некоторые из них здесь . Я тестировал Boehm GC на C ++, выделяя с помощью,
malloc
но не освобождая, выделяя и освобождая с помощьюfree
GC, созданного на заказ, написанного на C ++, и все по сравнению со стандартным GC OCaml, на котором работает решатель n-queens на основе списка. GC OCaml был быстрее во всех случаях. Программы на C ++ и OCaml были специально написаны для выполнения одинакового распределения в одном и том же порядке.Конечно, вы можете переписать программы для решения проблемы, используя только 64-битные целые числа и без выделения. Хотя это было бы быстрее, это побило бы смысл упражнения (которое должно было предсказать производительность нового алгоритма GC, над которым я работал, используя прототип, построенный на C ++).
Я провел много лет в отрасли, портируя реальный код C ++ на управляемые языки. Почти в каждом отдельном случае я наблюдал существенные улучшения производительности, многие из которых, вероятно, были связаны с тем, что GC затормозил ручное управление памятью. Практическое ограничение заключается не в том, что может быть достигнуто в микробенчмарке, а в том, что может быть достигнуто до истечения крайнего срока, и языки на основе GC предлагают такие огромные улучшения производительности, что я никогда не оглядывался назад. Я все еще использую C и C ++ на встроенных устройствах (микроконтроллерах), но даже сейчас это меняется.
источник
List.filter
как в C ++. Но, да, вы, конечно, совершенно правы, что некоторые операции RC могут быть исключены. Тем не менее, самая большая проблема, которую я вижу в дикой природе, заключается в том, что у людей нет времени, чтобы вручную выполнить такую оптимизацию на больших промышленных кодах.shared_ptr
просто исправить ошибки параллелизма. Код работает намного медленнее, но теперь он работает.Такой пример обязательно имеет плохую схему распределения памяти вручную.
Предположим, лучший сборщик мусора
GC
. Внутри него есть методы для выделения памяти, определения того, какая память может быть освобождена, и методы для ее окончательного освобождения. Вместе они занимают меньше времени, чем всеGC
; некоторое время уходит на другие методыGC
.Теперь рассмотрим ручной распределитель, который использует тот же механизм выделения
GC
, иfree()
вызов которого просто выделяет память для освобождения тем же методом, что иGC
. У него нет фазы сканирования и других методов. Это обязательно займет меньше времени.источник
free
также может собирать партии. (И, конечно, удаление всех элементов, отвечающих критерию, по-прежнему равно O (N), хотя бы из-за самого обхода списка)free
могли бы работать в режиме пакетного сбора, если с каждым элементом памяти был связан флаг, хотя в некоторых ситуациях GC все еще может выйти вперед. Если имеется M ссылок, которые идентифицируют L различных элементов из набора из N вещей, время для удаления каждой ссылки, на которую не существует никакой ссылки, и консолидации остатка, составляет O (M), а не O (N). Если у вас есть M доступного дополнительного пространства, константа масштабирования может быть довольно маленькой. Кроме того, для компактификации в не сканирующей системе ГХ требуется ...