Было бы тривиальным количество дополнительной работы, когда маркировка объектов по-прежнему ссылается, предполагая, как str
и output
еще в области видимости (то есть связывание, где они существуют все еще активны), когда Началась отметка GC mark. Обе переменные начнут отмечать одну и ту же строку. Я не знаю, но подозреваю, что, отмечая объекты как все еще жизнеспособные, если Ruby попадает на элемент, уже отмеченный, он, вероятно, прекратит рекурсию и перейдет к следующему элементу на том же уровне. В этом случае String представляет собой один объект без дочерних объектов, чтобы отметить его дальше, так что это быстрый вызов для rb_gc_mark
, повторяющийся для каждой ссылки на String
- в одном случае, когда он отмечен, а в другом случае, когда Ruby отмечает, что он уже отмечен и прекращает рекурсию.
Если ни одна из переменных были в какой-либо активной связывания, когда фаза GC метка начала, это никакой дополнительной работы, String
ссылки не будут получать отмеченные (без работы) и фаза развертки не будет удалить его только один раз (ту же работу, независимо от того, как многие ссылки были активны до этого).
'output =: asdf.to_s.upcase' будет создавать только один символ': output', но позже будет создан 2 ': str',': output'. –