2012-10-12 14 views
12

Ja prawie nie używam metody reverse_each, zamiast tego wzywam reverse.each, kiedy potrzebuję przejść tablicę do tyłu. Po prostu wykonałem kilka testów porównawczych i pozornie reverse_each jest znacznie szybszy niż reverse.each.Dlaczego Array.reverse_each jest szybszy niż Array.reverse.each

  • Czy to dlatego, że istnieje element czasu związany z tworzeniem tablicy odwrotnej przed jej iteracją podczas korzystania z reverse.each?

Jednak w moim przykładzie (poniżej) z 10 milionów iteracji TIME(reverse) + TIME(each) - TIME(reverse.each) ~ 1.2 seconds dla tablicy 4. WIELKOŚĆ i ta różnica czasu mniej lub bardziej jest stabilny niezależnie od wielkości tablicy. Przetestowałem to na 100 elementów.

  • Co odpowiada za tę jedną drugą różnicę?

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 

Odpowiedz

7

na pewno powiedzieć, że ma do czynienia z czasem obcowania z tworzenia odwrotną tablicę! Próbowałeś tylko naprawdę małych tablic (tablica z 100 elementami wciąż jest małą tablicą). Jeśli spróbujesz z większymi tablicami (na przykład 10k elementów), myślę, że naprawdę zauważysz różnicę.

+0

to samo nswer, jeszcze szybciej :) +1 – apneadiving

Powiązane problemy