Dlaczego Array.reverse_each jest szybszy niż Array.reverse.each

Prawie nie używamreverse_each zamiast tego wzywamreverse.each kiedy muszę przejść przez tablicę do tyłu. Więc po prostu przeprowadziłem testy porównawcze i najwyraźniejreverse_each jest znacznie szybszy niżreverse.each.

Czy to dlatego, że istnieje element czasu związany z tworzeniem odwrotnej tablicy przed iterowaniem przez nią podczas używaniareverse.each?

Jednak w moim przykładzie (poniżej) 10 milionów iteracjiTIME(reverse) + TIME(each) - TIME(reverse.each) ~ 1.2 seconds dla tablicy o rozmiarze 4. I tym razem różnica mniej więcej pozostaje stabilna niezależnie od wielkości tablicy. Przetestowałem go do 100 elementów.

Co odpowiada tej jednej drugiej różnicy?
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

questionAnswers(2)

yourAnswerToTheQuestion