Ruby 为什么Array.reverse\u each比Array.reverse.each快

Ruby 为什么Array.reverse\u each比Array.reverse.each快,ruby,arrays,Ruby,Arrays,我几乎不使用reverse\u each方法,而是在需要向后遍历数组时调用reverse.each。所以我刚刚做了一些基准测试,显然reverse\u每个都比reverse.each快得多 这是因为在使用reverse.each时,在遍历反向数组之前,有一个与创建反向数组相关的时间元素吗 然而,在我的示例(如下)中,对于大小为4的数组,1000万次迭代TIME(reverse)+TIME(each)-TIME(reverse.each)~1.2秒。不管阵列的大小,这个时差或多或少都保持稳定。

我几乎不使用
reverse\u each
方法,而是在需要向后遍历数组时调用
reverse.each
。所以我刚刚做了一些基准测试,显然
reverse\u每个
都比
reverse.each
快得多

  • 这是因为在使用
    reverse.each
    时,在遍历反向数组之前,有一个与创建反向数组相关的时间元素吗
然而,在我的示例(如下)中,对于大小为4的数组,1000万次迭代
TIME(reverse)+TIME(each)-TIME(reverse.each)~1.2秒。不管阵列的大小,这个时差或多或少都保持稳定。我已经测试了多达100个元素

  • 是什么导致了这一秒的差异


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

这非常简单:

  • 反向。每个
    创建一个新数组,然后循环每个元素

  • reverse\u每个
    按相反顺序循环(未创建中间数组)


请参阅doc中的源代码:

相同的答案,甚至更快:)+1可能值得指出的是,这只是数组的情况,其他可枚举项(包括哈希)会为#reverse_each()创建一个中间数组,因此不会为这些操作节省任何时间。
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