2010-08-05 25 views
9

Estoy buscando hacer referencia a un par de mis solicitudes ActiveRecord en mi aplicación. ¿Cuál es la manera más simple de la consola para algo como referenciaBenchmarking rails ActiveRecord Queries

User.find_by_name("Joe").id 

frente

User.find(:first, :select => :id, :conditions => ["name = ?","Joe"]).id 

Gracias

Respuesta

1

Usar secuencia de comandos/rendimiento/benchmarker:

script/performance/benchmarker 2000 "User.find_by_name('Joe').id" "User.first(:conditions => {:name => 'Joe'}, :select => 'id').id" 

En mi máquina dev, este informa:

  user  system  total  real 
#1  1.110000 0.070000 1.180000 ( 1.500366) 
#2  0.800000 0.050000 0.850000 ( 1.078444) 

Por lo tanto, el segundo método parece ser más rápido, ya que tiene menos trabajo por hacer. Por supuesto, usted debe referente esto en su máquina de producción, utilizando el entorno de producción:

RAILS_ENV=production script/performance/benchmarker 2000 "User.find_by_name('Joe').id" "User.first(:conditions => {:name => 'Joe'}, :select => 'id').id" 

Se puede cambiar un poco las condiciones para usted.

+0

Desde '3.0' será' rails benchmarker ... ' – jibiel

4

En el modo de desarrollo de cada consulta se mide el tiempo y se registra en el registro/development.log. Vas a tener líneas como:

Ad Load (1.4ms) SELECT "ads".* FROM "ads" ORDER BY created_at DESC 
+3

que informa el tiempo de consulta real en la parte del servidor de la base de datos. No mide el trabajo de ORM, como crear un montón de objetos para cada registro. –

28

Esta pregunta es un poco antigua y necesita una respuesta actualizada. La forma más fácil de comparar la consulta fuera de un escenario de producción sería ejecutarla en rails console (la secuencia de comandos benchmarker ya no está en Rails). Luego, simplemente puede probar usando la clase Benchmark incorporada en Ruby. Ejecute el siguiente en Rails:

puts Benchmark.measure { User.find_by_name("Joe").id } 
puts Benchmark.measure { User.find(:first, :select => :id, :conditions => ["name = ?","Joe"]).id } 

había corrido los anteriores 5 veces, desechar el mínimo y el máximo, y tomo el costo promedio de las tres carreras restantes de averiguar qué consulta se va a dar un mejor rendimiento .

Esta es la solución más precisa para obtener el verdadero del costo de una consulta desde Rails doesn't show you the cost to actually construct your objects. Entonces, mientras que @Slobodan Kovacevic la respuesta es correcta porque el registro muestra cómo se realiza la consulta, la longitud no le da tiempo de construcción del objeto que puede ser menor para su segunda consulta ya que solo está poblando un solo campo frente a todos los campos de usuario .