创建中间变量会导致垃圾收集器做更多工作吗?
也就是说,之间有什么区别:
output = :asdf.to_s.upcase
和
str = :asdf.to_s
output = str.upcase
? (假设永远不再引用str
。)
答案 0 :(得分:1)
当标记仍然引用的对象时,假设str
和output
仍在范围内(即它们存在的绑定仍处于活动状态)GC标记时,这将是一项微不足道的额外工作量阶段开始了。两个变量都会在同一个字符串上开始标记。我不知道,但怀疑当标记对象仍然可行时,如果Ruby遇到已标记的项目,它可能会停止递归并转到同一级别的下一个项目。在这种情况下,String是一个没有子对象的单个对象,可以进一步标记,因此对rb_gc_mark
的每个引用重复一次String
的快速调用 - 一个标记的情况,另一个案例,Ruby注意到它已被标记并停止递归。
如果GC标记阶段开始时,任何活动绑定中都没有变量,则不会有额外的工作,引用的String
不会被标记(没有工作),扫描阶段只会删除一次(同样的工作)无论之前有多少参考文献都是活跃的。)