ruby on rails - rails - ¿Por qué los rieles son tan lentos y qué puedo hacer al respecto?
ruby on rails que es (9)
Rails 3.0 es un perro serio. He estado desarrollando en Rails durante 5 años, y nunca ha sido más lento para iniciar. En particular, las pruebas tardan una eternidad en arrancar en una MacBook de primera clase con SSD, por lo que los ciclos de iteración sufren severamente. Necesito leer un artículo cada vez que empiezo una prueba. Es una locura y no es "ágil". También podría estar compilando.
Esta es la principal motivación para que finalmente me vaya de Rails, cuando tengo la oportunidad.
Si alguien tiene una solución, por favor ofrézcala. Sé que muchas personas sufren este problema.
No uso rspec: sé que hay una solución para ayudar con las pruebas de rspec.
Estoy usando faster_require y rails-dev-boost, pero no hay un impacto significativo.
Estoy en ruby 1.9.2 y necesito estarlo. ¡Una única y sencilla prueba de controlador demora 26 segundos en una MacBook Air de doble núcleo de 2,13 GHz con 4 GB de RAM y SSD! ¿¡Por qué!?
Buenas noticias. Rails se inicia dentro de un tiempo tolerable después de actualizar a Ruby 1.9.3.
Como @ user185374 dice, estás pagando la compensación del require
.
Me encontré con un resource interesante para acelerar las pruebas de Rails
sin usar Rails
... El ejemplo se da con Rspec
pero tendrás la lógica.
Así es como resume el escritor:
No puedo decirte lo que significa ejecutar todas mis más de 150 especificaciones en 2 segundos. Creo que es un poco más de trabajo, pero vale la pena el esfuerzo.
Otra solución que acabo de encontrar: prueba paralela de Hydra
:
http://logicalfriday.com/2011/05/18/faster-rails-tests-with-hydra/
Echa un vistazo a spork . Básicamente ejecuta un pequeño servidor que ejecuta el arranque y luego espera las ejecuciones de prueba, lo que le permite arrancar una vez y luego probar muchas veces desde ese estado. Ocasionalmente tendrá que reiniciarlo si realiza ciertos tipos de cambios en la configuración, pero en su mayor parte le permite tener iteraciones de refactor rojo-verde muy rápidas.
Es un intercambio para pagar por no tener que escribir declaraciones ''require''. Rails está intentando hacer lo correcto y, por lo tanto, precarga todo. Básicamente tienes dos soluciones:
- Utilice la biblioteca de precarga que engendra el proceso Rails ( spork, por ejemplo)
- No use Rails en sus pruebas, extraiga el dominio que puede probar fuera de Rails (Destroy All Software tiene un screencast sobre esto). Todo se reduce a saltar los rieles de carga , cuando sea posible.
Con todo lo que dije, usando la solución 1). y hacer que mi suite corra menos de medio segundo (solo 70 pruebas, pero esperar a que Rails cargue es mínimo)
Este es un problema conocido, especialmente en Ruby 1.9.2.
La buena noticia es que hay un parche para acelerar la puesta en marcha de Ruby ( require
) inmensamente.
Mira la gema zeus .
Esto debería acelerar las cosas bastante significativamente.
Para citar a Yehuda Katz:
Hay cosas que el código de C requiere en 1.9 que ralentiza las cosas. Un ejemplo de esto es volver a verificar $ LOAD_PATH para asegurarse de que todo se expande en cada requerimiento. Esto es algo que debería abordarse con ruby-core. Abriré un ticket en Redmine si aún no hay uno.
También estoy experimentando este problema y un problema $ LOAD_PATH parece ser una posible causa. Esperemos que se solucione pronto.
Por lo tanto, me parece que tendrás que pasar por esto y espero que se solucione en Ruby 1.9.3.
Sí, es ridículamente lento. Oh, espera, mvn install
en mi java días nunca tomó menos de un minuto. Con mvn clean install
, fue una locura. Días felices, recordar siempre despierta mi espíritu.
+1 spork
, como sugiere @hammar
combine con guard
https://github.com/guard/guard-test para iniciar automáticamente las pruebas y tiene un combo asesino. Haga que se ejecute en su propia ventana y / o pantalla y vea que su productividad aumenta :)
Actualización / adición a la respuesta:
Sugerencia de optimización: ponga un to_s
en las rutas agregadas a autoload_paths, en application.rb, evitando que se haga esto manualmente una y otra vez en tiempo de ejecución. Podría afeitarse unos segundos ...
el problema parece ser la lentitud de requerir, si haces un perfil mínimo como
CPUPROFILE=/tmp/my_app_profile RUBYOPT="-r`gem which perftools | tail -1`" ruby -I lib:test test/unit/user_test.rb
pprof.rb --text /tmp/my_app_profile
probablemente deberías ver un montón de tiempo gastado en requerir (otra opción es ver mucho en la carga del accesorio, pero supongo que ya sabes que ese no es el problema).
En mi caja (osx en un macbook pro 2011 13 ", con Core i5 y un disco duro giratorio), el tiempo es más del orden de 5 segundos, que es mucho más tolerable, por lo que vale la pena investigar las diferencias .
¿Cuántas gemas tienes instaladas en tu sistema? ¿Has intentado ejecutar las pruebas / arranque sin bundler / rubygems?