2017-09-03 46 views
-1

Ruby中Array初始化的兩種不同方式之間的複雜性區別是什麼?Ruby中Array的兩種不同初始化方式之間的複雜性區別是什麼

我需要我的新數組初始化爲0

我可以做任何的方式:

newArray = Array.new(a,0) 

newArray = Array.new(a){|i| i*0} 

我需要知道時間之間的差如果有複雜性?

+0

'{| i |我* 0}'完全沒有意義,因爲它與'{0}'相同。你是不是指'[0] * a'? – mudasobwa

+0

是的,它與{0} – Sarthak

+0

相同因此,'[0] * a'是相同的。 – mudasobwa

回答

0

有趣的問題。讓我們利用benchmark模塊,看看這兩種變化是如何進行的。

Benchmark.realtime do |x| 
    10_000.times { Array.new(1000, 0) } 
end 
#=> 0.032521000131964684 
Benchmark.realtime do |x| 
    10_000.times { Array.new(1000) { 0 } } 
end 
#=> 0.49374799989163876 

正如您所看到的,第一個實現比塊初始化快n倍。根據Array.newdescription,最後一種形式通過將元素的索引傳遞給塊並存儲返回值來填充每個元素。在這個版本中,應該有需要空間和CPU的中間變量創建和存儲。

if (rb_block_given_p()) { 
     long i; 

     if (argc == 2) { 
      rb_warn("block supersedes default value argument"); 
     } 
     for (i=0; i<len; i++) { 
      rb_ary_store(ary, i, rb_yield(LONG2NUM(i))); 
      ARY_SET_LEN(ary, i + 1); 
     } 
    } 

VS

ary_memfill(ary, 0, len, val); 

ary_memfill迭代在O(n)和設置值[ref]rb_ary_store(在前)使用rb_ary_modify這是它自己的一組計算。

+0

'快n倍? 0.49374799989163876/0.032521000131964684約爲15. –

+0

糟糕。並不意味着n在數組長度那裏。 – kiddorails

相關問題