Ruby垃圾收集是否受中间变量的影响?

时间:2014-01-30 19:48:38

标签: ruby garbage-collection interpreter

创建中间变量会导致垃圾收集器做更多工作吗?

也就是说,之间有什么区别:

output = :asdf.to_s.upcase

str = :asdf.to_s
output = str.upcase

? (假设永远不再引用str。)

1 个答案:

答案 0 :(得分:1)

当标记仍然引用的对象时,假设stroutput仍在范围内(即它们存在的绑定仍处于活动状态)GC标记时,这将是一项微不足道的额外工作量阶段开始了。两个变量都会在同一个字符串上开始标记。我不知道,但怀疑当标记对象仍然可行时,如果Ruby遇到已标记的项目,它可能会停止递归并转到同一级别的下一个项目。在这种情况下,String是一个没有子对象的单个对象,可以进一步标记,因此对rb_gc_mark的每个引用重复一次String的快速调用 - 一个标记的情况,另一个案例,Ruby注意到它已被标记并停止递归。

如果GC标记阶段开始时,任何活动绑定中都没有变量,则不会有额外的工作,引用的String不会被标记(没有工作),扫描阶段只会删除一次(同样的工作)无论之前有多少参考文献都是活跃的。)