2014-01-30 3 views
0

Создает ли промежуточные переменные сборщик мусора, чтобы сделать больше работы?Является ли сборка мусора Ruby промежуточными переменными?

То есть, есть ли разница между:

output = :asdf.to_s.upcase 

и

str = :asdf.to_s 
output = str.upcase 

? (Предположим, что str никогда не ссылаются снова.)

+0

'output =: asdf.to_s.upcase' будет создавать только один символ': output', но позже будет создан 2 ': str',': output'. –

ответ

1

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

Если ни одна из переменных были в какой-либо активной связывания, когда фаза GC метка начала, это никакой дополнительной работы, String ссылки не будут получать отмеченные (без работы) и фаза развертки не будет удалить его только один раз (ту же работу, независимо от того, как многие ссылки были активны до этого).

Смежные вопросы