¿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
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.
Hay una Railscast de perfiles que vale la pena ver
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.
El enlace está roto (DNS caducado). – mrzasa
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).
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
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. –
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
Esto funciona en Rails 4.2.6:
o=OpenStruct.new(logger: Rails.logger)
o.extend ActiveSupport::Benchmarkable
o.benchmark 'name' do
# ... your code ...
end
- 1. Rieles: Cómo determinar controlador/acción en vista
- 2. método indefinido `devise_for 'en el controlador de acción de rieles
- 3. ¿Puedo invocar una acción en otra acción (en un controlador de rieles)?
- 4. Rieles: nombre de la acción del controlador en la cadena
- 5. ¿Cómo se emite una respuesta 404 de una acción de controlador de rieles?
- 6. Rieles: ¿cómo se usa javascript condicional en el controlador/acción
- 7. Rieles: ¿Cómo POSTAR internamente a otra acción del controlador?
- 8. Rieles: ruta a la acción del controlador personalizado
- 9. Rieles before_filter e identificación de acción
- 10. Crear nueva acción de rieles no funciona?
- 11. Devolución de una redirección 301 desde una acción de controlador
- 12. ¿Cuál es la forma correcta de ejecutar una acción de controlador desde otra acción de controlador sin una redirección HTTP?
- 13. lista Rieles variables de instancia del controlador
- 14. Diseño de rieles por controlador
- 15. Uso de jQuery para llamar a una acción de controlador
- 16. Por qué el método de acción del controlador de rieles requiere el parámetro
- 17. El controlador de rieles no acepta JSON?
- 18. Ciclo de vida del controlador de rieles
- 19. Acceso de Activos de rieles controlador
- 20. controlador de Acción Prueba que utiliza User.Identity.Name
- 21. ¿Cómo pruebo la unidad de una acción de controlador que utiliza su controlador. Variable de usuario?
- 22. Restringir campos específicos de la respuesta del controlador de rieles
- 23. Render acción del controlador desde otro controlador
- 24. Crear una nueva acción para el controlador existente
- 25. ASP.NET MVC enviando datos JSON a una acción de controlador
- 26. Anula una acción del controlador de Rails Engine
- 27. Generar direcciones URL utilizando T4MVC en una acción de controlador
- 28. ¿Cómo debería ser una acción de controlador si solo redirige?
- 29. acción masiva en formas relajantes con rieles?
- 30. rieles, enrutamiento muchas rutas con nombre a una acción
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. –