JRuby on Rails vs Ruby on Rails, quelle différence?

135

Je cherche à essayer JRuby et JRuby on Rails. J'ai du mal à trouver des informations sur la différence entre JRuby on Rails et Ruby on Rails.

Quelles sont les différences que je dois rechercher?

epochwolf
la source

Réponses:

160

JRuby est l'implémentation Ruby qui s'exécute sur une JVM tandis que Ruby de Matz est une implémentation C.

Les principales caractéristiques à noter sont:

  1. JRuby fonctionne sur des machines virtuelles Java et il est compilé ou interprété jusqu'au code d'octet Java.
  2. JRuby peut s'intégrer au code Java. Si vous avez des bibliothèques de classes Java (.jar), vous pouvez les référencer et les utiliser à partir du code Ruby avec JRuby. Dans l'autre sens, vous pouvez également appeler du code JRuby depuis Java. JRuby peut également utiliser les capacités de la JVM et du serveur d'applications.
  3. JRuby est généralement hébergé sur des serveurs d'applications Java tels que Sun's GlassFish ou même le serveur Web Tomcat.
  4. Bien que vous ne puissiez pas utiliser les gemmes Ruby natives avec JRuby, il existe des implémentations de JRuby pour la plupart des bibliothèques Ruby populaires.

Il existe d'autres différences répertoriées sur le wiki JRuby:

utilisateur23117
la source
Merci, cela répond à peu près à tout ce que je recherchais. :)
epochwolf
4
oh, et il tourne un peu plus lentement que 1.9
rogerdpack
1
Pour voir les différences de performances dans JRuby on Rails, il est recommandé d'avoir une machine multicœur avec des ressources suffisantes. Les requêtes de base de données lentes peuvent également gêner JRuby et provoquer des performances similaires ou plus lentes que l'IRM sur rails. JRuby utilise également beaucoup plus de mémoire initiale que l'IRM.
Joseph Ravenwolfe
Nous avons à la fois des performances massives avec l'utilisation de jruby avec Oracle sur VPN (les tests se déroulent incroyablement lentement) et aussi localement (pas de VPN) le démarrage de ruby, rails console, etc. prend 30 secondes + au lieu de 3.
Michael Durrant
57

Je suis surpris qu'il manque un élément crucial dans toutes les réponses à cette question, lié à GIL .

La principale différence dont vous devriez vous soucier esp. dans les applications Web telles que celles construites avec Rails est une véritable concurrence ("Global Interpreter Lock" gratuit). Lorsque deux threads sont en cours d'exécution (par exemple, servant 2 requêtes utilisateur) avec JRuby, ils sont capables de fonctionner simultanément dans un seul processus, tandis que dans MRI il y a le GIL (même avec les threads natifs de 1.9) qui évite d'exécuter du code Ruby en parallèle.

Pour un développeur d'application, c'est la première chose à garder à l'esprit lors de l'examen de JRuby, car il brille vraiment config.threadsafe!mais vous oblige à vous assurer que votre code (et votre code de gemmes) est "vraiment" thread-safe.

kares
la source
7

Je me trompe peut-être, mais je pense que vous pouvez empaqueter une application JRuby on Rails d'une manière que vous ne pouvez pas faire avec un RoR normal - regardez Mingle ou similaire. Permet de vendre sans laisser tomber votre pantalon / ouvrir le komono.

Cela dit, je ne connais pas assez bien les emballages RoR, alors ne me retenez pas :)

Nic Wise
la source
1
Vous avez tout à fait raison sur ce point, même si vous aurez besoin de quelque chose comme le gem Rawr ou Roir pour le faire complètement (la dernière fois que j'ai utilisé Mingle, il y avait des fichiers Ruby non obscurcis ...).
Marnen Laibow-Koser
3

la plupart du temps, cela devrait fonctionner de la même manière. dans jRoR, vous pouvez accéder à des éléments que vous n'auriez pas dans RoR. Habituellement, c'est principalement un problème de déploiement.

Cependant, si votre application RoR utilise des bibliothèques natives qui n'ont pas d'équivalent qui s'exécute sur la JVM, cela peut être pénible. Cependant, la plupart des bibliothèques ont une version non native disponible (du moins les plus populaires que j'ai rencontrées).

Michael Neale
la source
0

Il y a déjà de bonnes réponses ici.

eebbesen a déjà couvert les bases, et kares (lui-même!) nous a dit que JRuby n'avait pas de GIL.

J'ajouterai d'un point de vue plus pratique, j'ai lancé des applications sur Ruby on Rails, puis migré vers JRuby pour des raisons de performances.

Il y avait deux principaux avantages en termes de performances: JRuby est (ou était) tout simplement plus rapide que Ruby dans certaines circonstances, et deuxièmement, l'absence de mentions Global Interpreter Lock kares m'a permis de faire du multithreading, ce qui, bien que délicat, débloque des avantages en termes de performances. .

Une très grande application Ruby on Rails portée et exécutée en une heure, des gemmes et tout. Le seul problème réel était que les expressions rationnelles de Java sont légèrement différentes de celles de Ruby. C'est une réalisation monumentale de la part de JRuby.

user2057354
la source