2012-10-12 43 views
12

我几乎不用reverse_each方法,而是在我需要向后遍历数组时调用reverse.each。所以我只是做了一些基准测试,显然reverse_each明显快于reverse.each为什么Array.reverse_each比Array.reverse.each快

  • 这是因为存在与在创建使用reverse.each时通过它迭代之前的反向阵列相关联的时间的元素?

然而在我的示例1000万次迭代TIME(reverse) + TIME(each) - TIME(reverse.each) ~ 1.2 seconds为大小4的阵列,并且该时间差或多或少保持稳定而不管阵列的大小的(下文)。我已经测试了多达100个元素。

  • 什么解释了这一秒差异?

require 'benchmark' 

number = 10000000 
arr = (1..4).to_a 

Benchmark.bm(13) do |x| 
    x.report("reverse.each") { number.times { arr.reverse.each {|x| x} } } 
    x.report("reverse_each") { number.times { arr.reverse_each {|x| x} } } 
    x.report("reverse")  { number.times { arr.reverse } }    
    x.report("each")   { number.times { arr.each {|x| x} } }   
end 

回答

7

我肯定会说,它已与时间建立反向关联数组做的!你只尝试过很小的数组(一个有100个元素的数组仍然是一个小数组)。如果您尝试使用更大的阵列(例如10k个元素),我认为您会真正注意到其中的差异。

+0

相同a更快,更快:) +1 – apneadiving