JRuby on Rails vs. Ruby on Rails, ¿cuál es la diferencia?

135

Estoy buscando probar JRuby y JRuby on Rails. Tengo problemas para encontrar información sobre la diferencia entre JRuby on Rails y Ruby on Rails.

¿Cuáles son las diferencias que debo tener en cuenta?

epochwolf
fuente

Respuestas:

160

JRuby es la implementación de Ruby que se ejecuta en una JVM, mientras que Ruby de Matz es una implementación de C.

Las características clave a tener en cuenta son:

  1. JRuby se ejecuta en máquinas virtuales Java y se compila o interpreta en código de bytes Java.
  2. JRuby puede integrarse con código Java. Si tiene bibliotecas de clases Java (.jar's), puede hacer referencia a ellas y utilizarlas desde el código Ruby con JRuby. En la otra dirección también puede llamar al código JRuby desde Java. JRuby también puede usar la JVM y las capacidades del servidor de aplicaciones.
  3. JRuby generalmente está alojado dentro de servidores de aplicaciones Java como Sun's GlassFish o incluso el servidor web Tomcat.
  4. Aunque no puede usar gemas nativas de Ruby con JRuby, existen implementaciones de JRuby para la mayoría de las bibliotecas populares de Ruby.

Hay otras diferencias que se enumeran en la wiki de JRuby:

usuario23117
fuente
Gracias, eso responde a casi todo lo que estaba buscando. :)
epochwolf
44
ah, y funciona un poco más lento que 1.9
rogerdpack
1
Para ver las diferencias de rendimiento en JRuby on Rails, se recomienda tener una máquina multinúcleo con recursos suficientes. Las consultas lentas de la base de datos también pueden obstaculizar a JRuby y hacer que funcione de manera similar o más lenta que MRI en Rails. JRuby también usa significativamente más memoria inicial que MRI.
Joseph Ravenwolfe
Tenemos tanto el rendimiento masivo con el uso de jruby con Oracle a través de VPN (pruebas se ejecutan muy lentamente) y también a nivel local (sin VPN) acaba de poner en marcha el rubí, carriles consola, etc tarda 30 segundos en lugar de 3. +
Michael Durrant
57

Me sorprende que falte algo crucial en todas las respuestas a esta pregunta, relacionadas con GIL .

La principal diferencia que debería preocuparte especialmente. en aplicaciones web como las construidas con Rails es verdadera concurrencia ("Global Interpreter Lock" gratis). Cuando se ejecutan dos subprocesos (por ejemplo, atiende a 2 solicitudes de usuarios) con JRuby, son capaces de ejecutarse simultáneamente en un solo proceso, mientras que en MRI está el GIL (incluso con subprocesos nativos de 1.9) que evita ejecutar código Ruby en paralelo.

Para un desarrollador de aplicaciones, esto es lo primero que debe tener en cuenta al considerar JRuby, ya que realmente brilla config.threadsafe!pero requiere que se asegure de que su código (y su código de gemas) sean "verdaderamente" seguros para subprocesos.

kares
fuente
7

Puede que me equivoque, pero creo que puedes empaquetar una aplicación JRuby on Rails de una manera que no puedes hacer con RoR normal: mira Mingle o similar. Hace posible vender sin caerse los pantalones / abrir el komono.

Dicho esto, no estoy lo suficientemente familiarizado con el empaquetado de RoR, así que no me sujete a él :)

Nic Wise
fuente
1
Tienes toda la razón en esto, aunque necesitarás algo como la gema Rawr o Roir para hacer esto por completo (la última vez que usé Mingle, tenía archivos Ruby no ofuscados ...).
Marnen Laibow-Koser
3

sobre todo debería funcionar igual. en jRoR puedes acceder a cosas que no tendrías en RoR. Por lo general, es principalmente una preocupación de implementación.

Sin embargo, si su aplicación RoR usa bibliotecas nativas que no tienen un equivalente que se ejecute en la JVM, eso puede ser una molestia. Sin embargo, la mayoría de las librerías tienen una versión no nativa disponible (al menos las más populares que he encontrado).

Michael Neale
fuente
0

Hay algunas respuestas geniales aquí ya.

eebbesen ya cubrió lo básico, y kares (¡él mismo!) nos ha dicho que JRuby no tiene GIL.

Agregaré desde una perspectiva más práctica, lancé aplicaciones en Ruby on Rails y luego migré a JRuby por razones de rendimiento.

Hubo dos beneficios principales de rendimiento: JRuby es (o fue) simplemente más rápido que Ruby en algunas circunstancias, y dos, la falta de las menciones de Global Interpreter Lock kares me permitieron hacer subprocesos múltiples, lo que, aunque difícil, desbloqueó beneficios de rendimiento de órdenes de magnitud .

Una aplicación muy grande de Ruby on Rails portó y ejecutó en una hora, gemas y todo. La única falla real fue que las expresiones regulares de Java son ligeramente diferentes a las de Ruby. Ese es un logro monumental por parte de JRuby.

usuario2057354
fuente