2011-11-20 13 views
8

El punto de referencia toma un bloque y devuelve el tiempo: http://ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.htmlEvaluación comparativa de una operación de rubí que devuelve un valor

require 'benchmark' 
puts Benchmark.measure { "a"*1_000_000 } 

¿Qué pasa si usted quiere una operación de referencia y obtener tanto el valor de retorno y el tiempo transcurrido?

O, dicho de otra manera, ¿puede un cierre modificar un objeto que se pasa dentro de él?

Respuesta

9

Un cierre puede modificar objetos en su alcance, así:

require 'benchmark' 

a = nil 
puts Benchmark.measure { a = "a" * 1_000_000 } 
puts a.size 

# => 0.000000 0.000000 0.000000 ( 0.004865) 
# => 1000000 
+0

¿Entonces los cierres tienen un puntero grabable para lo que se les pasa? Y los cierres también pueden modificar @a y @@ a, suponiendo que se definan fuera del cierre. – justingordon

+0

@justingordon: Sí, pueden. – Miikka

+3

Yuck. Realmente deseo que Benchmark devuelva algo como: '[tiempo, resultado] '. Entonces podrías: 'tiempo, a = Benchmark.measure {...}' – devth

0

Con https://github.com/igorkasyanchuk/benchmark_methods

No más código como este:

t = Time.now 
user.calculate_report 
puts Time.now - t 

ahora que se puede hacer:

benchmark :calculate_report # in class 

Y simplemente llame a su método

user.calculate_report 
Cuestiones relacionadas