2012-10-12 82 views
12

Casi no uso el método reverse_each, sino que llamo al reverse.each cuando tengo que atravesar una matriz hacia atrás. Así que acabo de hacer una evaluación comparativa y aparentemente reverse_each es significativamente más rápido que reverse.each.Por qué Array.reverse_each es más rápido que Array.reverse.each

  • ¿Esto se debe a que hay un elemento de tiempo asociado a la creación de una matriz inversa antes de recorrerlo cuando usa reverse.each?

Sin embargo, en mi ejemplo (abajo) de 10 millones de iteraciones TIME(reverse) + TIME(each) - TIME(reverse.each) ~ 1.2 seconds para una matriz de tamaño 4. Y esta diferencia de tiempo más o menos se mantiene estable con independencia del tamaño de la matriz. Lo he probado por hasta 100 elementos.

  • ¿Cuál es la razón de esta segunda diferencia?

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 

Respuesta

7

Sin duda diría que tiene que ver con el tiempo de la asociación con la creación de la matriz inversa! Solo has probado matrices realmente pequeñas (una matriz con 100 elementos sigue siendo una pequeña matriz). Si lo intentas con arreglos más grandes (por ejemplo, 10k elementos), creo que realmente notarás la diferencia.

+0

mismo a nswer, incluso más rápido :) +1 – apneadiving

Cuestiones relacionadas