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