2008-08-27 10 views
29

¿Cuál es la mejor manera de perfilar una acción de controlador en Ruby on Rails. Actualmente estoy usando el método de la fuerza bruta de lanzar llamadas puts Time.now entre lo que creo que será un cuello de botella. Pero eso se siente muy, muy sucio. Tiene que haber una mejor manera.Perfil de una acción de controlador de rieles

Respuesta

9

Utilice la biblioteca estándar de Benchmark y las diversas pruebas disponibles en Rails (unidad, funcional, integración). He aquí un ejemplo:

def test_do_something 
    elapsed_time = Benchmark.realtime do 
    100.downto(1) do |index| 
     # do something here 
    end 
    end 
    assert elapsed_time < SOME_LIMIT 
end 

Así que aquí nos limitamos a hacer algo 100 veces, el tiempo es a través de la biblioteca de referencia, y nos aseguramos de que tardó menos de SOME_LIMIT cantidad de tiempo.

También puede encontrar estos enlaces útiles: El Benchmark.realtime reference y el Test::Unit reference. Además, si le gusta la lectura de libros, recogí la idea del ejemplo de Agile Web Development with Rails, que habla sobre los diferentes tipos de pruebas y un poco sobre las pruebas de rendimiento.

+3

Esta respuesta que le dice cómo hacer que su acción está funcionando lo suficientemente rápido. No ayuda con el perfil, que es descubrir qué parte de la acción se está tomando más tiempo. –

1

Es posible que desee dar el servicio FiveRuns TuneUp una oportunidad, ya que es realmente bastante impresionante. Descargo de responsabilidad: no estoy asociado con FiveRuns de ninguna manera, acabo de probar este servicio.

TuneUp es un servicio gratuito mediante el cual descargas un complemento y cuando ejecutas la aplicación, inyecta un panel en la parte superior de la pantalla que se puede expandir para mostrar métricas de rendimiento detalladas.

Le da algunos buenos gráficos, incluido uno que muestra qué proporción de tiempo se gasta en el Modelo, Vista y Controlador. Incluso puede profundizar para ver las consultas SQL individuales que ActiveRecord está ejecutando si es necesario y puede mostrarle el esquema subyacente de la base de datos con otro clic.

Finalmente, puede cargar opcionalmente sus datos de creación de perfiles en el sitio de FiveRuns para obtener asesoramiento y análisis del rendimiento de la comunidad.

+3

El enlace está roto (DNS caducado). – mrzasa

39

Recogí esta técnica hace un tiempo y la encontré bastante útil.

Cuando está en su lugar, puede agregar ?profile=true a cualquier URL que llegue a un controlador. Su acción se ejecutará como de costumbre, pero en lugar de entregar la página renderizada al navegador, le enviará una página detallada y bien perfilada de ruby-prof que muestra dónde pasó su tiempo.

En primer lugar, añadir ruby-prof a su Gemfile, probablemente en el grupo de desarrollo:

group :development do 
    gem "ruby-prof" 
end 

añadiendo además un around filter a su ApplicationController:

around_filter :profile if Rails.env == 'development' 

def profile 
    if params[:profile] && result = RubyProf.profile { yield } 

    out = StringIO.new 
    RubyProf::GraphHtmlPrinter.new(result).print out, :min_percent => 0 
    self.response_body = out.string 

    else 
    yield 
    end 
end 

Lectura de la salida de ruby-prof es una un poco de arte, pero lo dejaré como un ejercicio.

nota adicional de ScottJShea: Si desea cambiar el lugar de medición de este tipo:

RubyProf.measure_mode = RubyProf::GC_TIME #example

Antes de la if en el método de perfil del controlador de aplicación. Puede encontrar una lista de las medidas disponibles en el ruby-prof page. Al escribir estas líneas, las secuencias de datos memory y allocations parecen estar dañadas (see defect).

+4

para cualquier persona que esté pasando esto, también necesita agregar "require 'ruby-prof'" en la parte superior de su ApplicationController. Además, para mí, tuve que modificar "self.response_body =" a "self.response.body =" (Rails 2.3.14) – Pavling

+0

Gracias por esos ajustes. 'response_body' se agregó en Rails 3.0. Y si usas bundler, no deberías necesitar ruby-prof, pero me alegro de que esta técnica sea bastante adaptable a una versión anterior de Rails. –

+0

Gracias por el consejo, Pavling. También estoy usando Rails 2.3.14, y tengo problemas para hacer que esto funcione. Obtengo "número incorrecto de argumentos (0 para 1)" en graph_html_printer.rb: 98: en 'full_name ', sin importar qué versión de ruby-prof instale. ¿Alguna idea de lo que podría estar causando eso? – jsarma

0

Esto funciona en Rails 4.2.6:

o=OpenStruct.new(logger: Rails.logger) 
    o.extend ActiveSupport::Benchmarkable 
    o.benchmark 'name' do 
     # ... your code ... 
    end 
Cuestiones relacionadas