2014-01-30 2 views
0

중간 변수를 생성하면 가비지 컬렉터가 더 많은 작업을 수행합니까?Ruby 가비지 수집은 중간 변수의 영향을 받습니까?

output = :asdf.to_s.upcase 

str = :asdf.to_s 
output = str.upcase 

:이다

사이 차이가 있습니까? 모두 str 가정,

+0

'output = : asdf.to_s.upcase'는 단 하나의 심볼'output :'을 만들지 만 나중에는'str',': output'을 만듭니다. –

답변

1

그것은 표시 객체가 여전히 참조 추가 작업 사소한 양의 것 (. str 다시 참조되지 않습니다 가정) 및 output (그들은 여전히 ​​활성화 된 존재하는 곳 즉, 바인딩) 때 여전히 범위 안에 있었다 GC 마크 단계가 시작되었습니다. 두 변수 모두 동일한 문자열에 표시를 시작합니다. 모르겠지만 오브젝트를 여전히 실행 가능한 것으로 표시 할 때 Ruby가 이미 표시된 항목을 발견하면 재귀를 중지하고 같은 레벨에서 다음 항목으로 이동합니다. 이 경우 문자열은 더 이상 표시 할 자식 객체가없는 단일 객체이므로 String에 대한 각각의 참조에 대해 rb_gc_mark에 대한 빠른 호출 중 하나가 표시됩니다. 표시된 경우와 루비가 이미 표시된 경우를 재귀를 멈 춥니 다.

GC 마크 단계가 시작될 때 변수가 활성 바인딩에없는 경우 추가 작업이 필요하지 않으며 참조 된 (작업 없음) 표시되지 않으며 스윕 단계에서 한 번만 삭제됩니다 많은 참고 문헌은 이전에 활발히 활동했다.)

관련 문제