3
하나의 객체에 결합하려는 커다란 배열 (1 천만 이상의 객체)을 가지고 있습니다 (간단히하기 위해 여기에 문자열을 가정 해 봅시다). 배열의 각 요소를 실행하십시오. 일부 처리를 통해 (함수 do_stuff
으로 추상화 됨). 이이 작업을 수행하는 두 가지 자연적인 방법입니다 :Ruby에서 각각의 메모리 효율을 줄이거 나 늘리십시오.
memo = ""
big_array.each do |e|
memo << do_stuff(e)
end
memo
및
big_array.reduce("") do |memo, e|
memo + do_stuff(e)
end
이 구문은 미학적으로 더 매력적이다 주입/줄일 수는 있지만, 문제는 더
메모리 효율적으로하는 것입니다. 우리는 이미
each is marginally more time efficient than reduce을 알고 있지만 메모리는 어떨까요?
Ruby에서 메모리 사용량을 프로파일 링 할 수있는 방법이 명확하지 않아서, 특히 코드 블록을 넘어서서 누군가가 포인터를 제공 할 수 있다면 분명히 감사 할 것입니다.
'메모'에 많이 달려 있다고 생각합니다. 여기에서 첫 번째 경우에는 문자열이 변형되어 두 번째 예제에서와 같이 모든 반복에서 새 인스턴스를 만들지 않습니다. –
두 번째 예제에서'+'대신'<<'를 사용할 수도 있습니다 (물론'each_with_object'가 더 나은 선택이 될 수 있습니다). 현재의 모양에서 저는 후자가 메모리 소비면에서 훨씬 더 나쁘다는 것을 확신합니다 (특히 '메모'가 커지는 경향이있는 경우). – samuil