2011-10-03 9 views
6

Cuando Rails se inicia, precarga todas sus dependencias (gems), lo que da como resultado un tiempo de inicio muy lento. En un proyecto de tamaño mediano en el que estoy trabajando, el tiempo de inicio de Rails es de 10 a 15 segundos, depende de la máquina.¿Por qué Rails precarga todas sus dependencias (gems) durante el tiempo de arranque?

Si bien esto no es un problema en la producción, es un gran dolor en el desarrollo. Especialmente cuando se trabaja TDD/BDD. Hay soluciones para acelerar las pruebas (como spork), pero introducen problemas propios.

Mi pregunta es: ¿por qué no requieren las dependencias necesarias en cada uno de los archivos de código, en lugar de precargar todo durante el tiempo de inicio?

¿Cuáles son las desventajas de los manuales? Las líneas adicionales de código?

+0

http://stackoverflow.com/questions/3418895/how-to-reload-all-gems-in-rails-3 – jimworm

+0

Considere utilizar el autotest o una herramienta similar cuando trabaje en el estilo TDD. – taro

+0

@taro Estoy usando guard-rspec (hace lo mismo que autottest), pero eso no ayuda con el tiempo de inicio. – arikfr

Respuesta

3

Rails no es PHP. Algunos recursos se cargan automáticamente, pero todos los que probablemente necesites se cargan en el arranque/inicialización porque es mejor hacerlo antes de que se realicen las solicitudes para que la aplicación esté lista y no se carguen de forma lenta cuando se solicite, disminuyendo la velocidad la primera solicitud Gran parte de esta definición de métodos y carga de clases de última hora sobre la marcha sigue ocurriendo, reduciendo el tiempo de carga a solo 10-15 segundos, pero si reduces 5-10 segundos de ese tiempo de carga, simplemente se agregaría a la primera solicitud. No es bueno, ¿verdad?

Gran parte del tiempo de carga que experimenta es en las gemas/complementos/bibliotecas que agrega a su proyecto. Muchos de los tamaños significativos ofrecen formas de cargar solo las porciones que necesita, y muchas más podrían usar esta optimización. Por ejemplo, si usted tiene un proyecto de rieles que no necesita Active Record, puede reemplazar:

require 'rails/all' 

... con:

require "action_controller/railtie" 
require "action_mailer/railtie" 
require "active_resource/railtie" 
require "rails/test_unit/railtie" 

... en su application.rb a la reducción en la carga (y evitar errores sobre la base de datos que no existe).

+0

Esto tiene sentido, pero si el problema está solo en producción/primera solicitud, hay otras maneras de resolverlo. ¿Por qué imponer penalidades al desarrollo? – arikfr

+0

Para mantener el desarrollo y la producción más cerca, supongo. Rails ayuda a aliviar el problema en el desarrollo al no almacenar en caché muchas clases, volver a cargarlas en cada solicitud para que no tenga que detener e iniciar el servidor con tanta frecuencia. Si tiene otras recomendaciones sobre cómo lograr esto, me encantaría escucharlas, y estoy seguro de que el equipo de Rails estaría encantado de ver un parche con mejoras. – coreyward

+0

No es una multa. Es el costo de hacer negocios; de todos modos, usted también recibirá el retraso en la carga de la primera página para su servidor de desarrollo. Solo se trata de si hay un retraso en su línea de comando o un retraso en su navegador. – Kelly

Cuestiones relacionadas