Pickaxe에 나오는 문단입니다.
The answer was simple and surprisingly effective. Rather than build the result string as it went along, the code was changed to store each CSV row as an element in an array… we were no longer building an ever-growing string that forced garbage collection.
“원래 문자열을 썼었는데 그걸 Array로 바꿨더니 빨라졌다. 그리고 빨라지게 하기 쉬웠던 이유는 “문자열”이란 타입을 쓴 것이 아니라 단지 << 이란 오퍼레이터에 반응하는가만 따지도록 프로그래밍이 되어있기 때문이다.” 라는 내용이었던 것으로 기억합니다.
그리고 이에 대한 해설 The Fully Upturned Bin입니다. 만약 저처럼 자바와 똑같을거라고 생각하면서 String 이니까 가베지가 나온 거아냐? 라고 추측하셨다면 읽어볼만한 글입니다. 추가로 ruby hacking guide의 5장에 루비 GC에 대한 설명이 있습니다. 네이버 번역기 돌린거지만 대충 읽을만 합니다.
여담인데, mutable string이 필요한 경우 자바에서는 흔히 StringBuffer를 씁니다. 그러나 JAVA5부터는 StringBuilder가 추가되었습니다. 전자는 thread-safe 하고 후자는 그렇지 않은 특징이 있죠. 또, 자바에서는 ruby hacking guide에서 stop & collect라고 설명된 그것을 copy collector라는 이름으로 사용하고 있습니다. Copy collector는 할당과 해제의 비용이 매우 낮다는 장점이 있으나 메모리를 절반으로 나누어 써야하고 결국은 복사비용이 든다는 문제가 있습니다.