3
我想要將一個大型數組(一千多萬個對象)合併成一個對象(爲了簡單起見,我們假設這裏是一個字符串)並運行數組中的每個元素通過一些處理(由函數do_stuff
提取)。有兩種自然的方式來做到這一點:Ruby中的每個內存效率與reduce/inject的比較
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中剖析內存使用情況,特別是只是一段代碼,所以如果有人可以提供一些指針,我也會很感激。
我認爲這取決於'備忘錄'的含義。在第一種情況下,字符串會發生變化,並且不會在每次迭代中創建新實例,就像在第二個示例中那樣。 – 2013-04-11 13:01:43
在你的第二個例子中,你也可以使用'<<'而不是'+'(儘管'each_with_object'會是更好的選擇)。在目前的形態下,我很確定後者在內存消耗方面更糟糕(尤其是如果「備忘錄」趨於變大)。 – samuil 2013-04-11 13:05:33