为什么Array.reverse_each比Array.reverse.each更快?

18

我很少使用reverse_each方法,相反当我需要倒序遍历数组时,我会调用reverse.each。所以我做了一些基准测试,结果发现reverse_eachreverse.each快得多。

  • 这是因为使用reverse.each在迭代之前需要创建一个反向数组的时间因素吗?

然而,在我的示例(如下所示)中进行了1000万次迭代,对于大小为4的数组,TIME(reverse) + TIME(each) - TIME(reverse.each) ~ 1.2秒。无论数组的大小如何,这种时间差异都保持得比较稳定。我已经测试过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
2个回答

23

1
值得一提的是,这只适用于数组,其他可枚举对象(包括哈希)在 #reverse_each 方法中会创建一个中间数组(参见源代码),因此对于它们来说并没有节省时间的效果。 - Janosch

9

我会毫不犹豫地说,这与创建反转数组所花费的时间有关!你只是尝试了非常小的数组(一个拥有100个元素的数组仍然很小)。如果你尝试更大的数组(例如10k个元素),我认为你将会真正感受到差异。


同样的答案,甚至更快 :) +1 - apneadiving

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接