2012-10-12 21 views
12

Non uso quasi il metodo reverse_each, ma invoco lo reverse.each quando devo attraversare un array all'indietro. Quindi ho appena fatto un po 'di benchmark e apparentemente reverse_each è significativamente più veloce di reverse.each.Perché Array.reverse_each è più veloce di Array.reverse.each

  • È questo perché c'è un elemento di tempo associato alla creazione di una matrice inversa prima iterazione attraverso di essa quando si utilizza reverse.each?

Tuttavia nel mio esempio (sotto) di 10 milioni di iterazioni TIME(reverse) + TIME(each) - TIME(reverse.each) ~ 1.2 seconds per un array di dimensione 4. E questa differenza di tempo più o meno brevi stabile indipendentemente dalla dimensione della matrice. L'ho testato per un massimo di 100 elementi.

  • Cosa rappresenta questa differenza di un secondo?

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 

risposta

7

avrei sicuramente dire che ha a che fare con il tempo di associazione con la creazione della matrice inversa! Hai provato solo array molto piccoli (un array con 100 elementi è ancora un piccolo array). Se provi con array più grandi (ad esempio 10k elementi), penso che noterai davvero la differenza.

+0

stesso a nswer, ancora più veloce :) +1 – apneadiving

Problemi correlati