2013-04-11 26 views
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中剖析內存使用情況,特別是只是一段代碼,所以如果有人可以提供一些指針,我也會很感激。

+0

我認爲這取決於'備忘錄'的含義。在第一種情況下,字符串會發生變化,並且不會在每次迭代中創建新實例,就像在第二個示例中那樣。 – 2013-04-11 13:01:43

+0

在你的第二個例子中,你也可以使用'<<'而不是'+'(儘管'each_with_object'會是更好的選擇)。在目前的形態下,我很確定後者在內存消耗方面更糟糕(尤其是如果「備忘錄」趨於變大)。 – samuil 2013-04-11 13:05:33

回答

0

我敢肯定,與地圖減少(如你的例子中所寫),你每次創建一個新的字符串+)。

使用<<您正在修改原始字符串。這應該會更好,因爲更少的GC循環將被觸發。

您提到您正在使用字符串作爲示例;所以很難回答你真正的問題。