18

我几乎不使用reverse_each方法,而是在reverse.each需要向后遍历数组时调用。所以我只是做了一些基准测试,显然reverse_eachreverse.each.

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

然而,在我的示例(如下)中,大小为 4 的数组进行了 1000 万次迭代TIME(reverse) + TIME(each) - TIME(reverse.each) ~ 1.2 seconds。无论数组的大小如何,这个时间差或多或少都保持稳定。我已经测试了多达 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
4

2 回答 2

23

这很简单:

  • reverse.each创建一个新数组,然后循环每个元素

  • reverse_each以相反的顺序循环(不创建中间数组)

请参阅文档中的源代码:http ://www.ruby-doc.org/core-1.9.3/Array.html#method-i-reverse_each

于 2012-10-12T13:01:01.407 回答
9

我肯定会说这与创建反向数组相关的时间有关!您只尝试过非常小的数组(包含 100 个元素的数组仍然是一个小数组)。如果您尝试使用更大的数组(例如 10k 个元素),我想您会真正注意到差异。

于 2012-10-12T12:59:45.470 回答