0
創建中間變量是否會導致垃圾回收器做更多工作?Ruby垃圾收集是否受中間變量影響?
也就是說,有沒有什麼區別:
output = :asdf.to_s.upcase
和
str = :asdf.to_s
output = str.upcase
? (假設str
便不再引用。)
創建中間變量是否會導致垃圾回收器做更多工作?Ruby垃圾收集是否受中間變量影響?
也就是說,有沒有什麼區別:
output = :asdf.to_s.upcase
和
str = :asdf.to_s
output = str.upcase
? (假設str
便不再引用。)
這將是當標記對象仍引用額外的工作瑣碎量,假設兩個str
和output
仍然在範圍(即結合,其中它們的存在仍然活躍)當GC標記階段開始。兩個變量都會在同一個字符串上開始標記。我不知道,但懷疑當標記對象仍然可行時,如果Ruby遇到已標記的項目,它可能會停止遞歸併轉到相同級別的下一個項目。在這種情況下,字符串是一個沒有子對象的單個對象,可以進一步標記,所以這是一個快速調用rb_gc_mark
對String
的每個引用重複 - 一種情況是它被標記,另一種情況是Ruby注意到它已被標記並且停止遞歸。
如果在GC標記階段開始時這兩個變量都不處於任何活動綁定狀態,則不需要額外的工作,String
引用將不會被標記(不工作),並且掃描階段只會刪除它一次(不管工作方式如何許多參考文獻在之前都很活躍)
'output =:asdf.to_s.upcase'只會創建一個符號':output',但後面的會創建2':str',':output'。 –