2014-01-30 52 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

這將是當標記對象仍引用額外的工作瑣碎量,假設兩個stroutput仍然在範圍(即結合,其中它們的存在仍然活躍)當GC標記階段開始。兩個變量都會在同一個字符串上開始標記。我不知道,但懷疑當標記對象仍然可行時,如果Ruby遇到已標記的項目,它可能會停止遞歸併轉到相同級別的下一個項目。在這種情況下,字符串是一個沒有子對象的單個對象,可以進一步標記,所以這是一個快速調用rb_gc_markString的每個引用重複 - 一種情況是它被標記,另一種情況是Ruby注意到它已被標記並且停止遞歸。

如果在GC標記階段開始時這兩個變量都不處於任何活動綁定狀態,則不需要額外的工作,String引用將不會被標記(不工作),並且掃描階段只會刪除它一次(不管工作方式如何許多參考文獻在之前都很活躍)