JRuby on Rails vs. Ruby on Rails, was ist der Unterschied?

135

Ich möchte JRuby und JRuby on Rails ausprobieren. Ich habe Probleme, Informationen darüber zu finden, was den Unterschied zwischen JRuby on Rails und Ruby on Rails ausmacht.

Was sind die Unterschiede, auf die ich achten muss?

Epochwolf
quelle

Antworten:

160

JRuby ist die Ruby-Implementierung, die auf einer JVM ausgeführt wird, während Matz's Ruby eine C-Implementierung ist.

Wichtige Merkmale sind:

  1. JRuby läuft auf Java-VMs und wird entweder kompiliert oder bis auf Java-Bytecode interpretiert.
  2. JRuby kann in Java-Code integriert werden. Wenn Sie über Java-Klassenbibliotheken (.jars) verfügen, können Sie diese im Ruby-Code mit JRuby referenzieren und verwenden. In der anderen Richtung können Sie JRuby-Code auch in Java aufrufen. JRuby kann auch die JVM- und Anwendungsserverfunktionen verwenden.
  3. JRuby wird normalerweise auf Java-Anwendungsservern wie Suns GlassFish oder sogar auf dem Tomcat-Webserver gehostet.
  4. Obwohl Sie mit JRuby keine nativen Ruby-Edelsteine ​​verwenden können, gibt es für die meisten gängigen Ruby-Bibliotheken JRuby-Implementierungen.

Es gibt andere Unterschiede, die im JRuby-Wiki aufgeführt sind:

user23117
quelle
Vielen Dank, das beantwortet fast alles, was ich gesucht habe. :)
Epochwolf
4
Oh, und es läuft ein bisschen langsamer als 1.9
Rogerdpack
1
Um Leistungsunterschiede in JRuby on Rails festzustellen, wird empfohlen, einen mehrfarbigen Computer mit ausreichenden Ressourcen zu verwenden. Langsame Datenbankabfragen können auch zu einem Engpass bei JRuby führen und dazu führen, dass es ähnlich oder langsamer als MRI auf Rails arbeitet. JRuby verwendet außerdem deutlich mehr Vorabspeicher als MRT.
Joseph Ravenwolfe
Wir haben sowohl eine enorme Leistung bei der Verwendung von jruby mit Oracle über VPN (Tests laufen unglaublich langsam) als auch lokal (kein VPN). Das Starten von Ruby, Rails Console usw. dauert 30 Sekunden + statt 3.
Michael Durrant
57

Ich bin überrascht, dass in allen Antworten auf diese Frage im Zusammenhang mit GIL eine entscheidende Sache fehlt .

Der Hauptunterschied, den Sie besonders interessieren sollten. In Webanwendungen, wie sie beispielsweise mit Rails erstellt wurden, ist echte Parallelität ("Global Interpreter Lock" kostenlos). Wenn zwei Threads mit JRuby ausgeführt werden (z. B. zwei Benutzeranforderungen bedienen), können sie gleichzeitig in einem einzigen Prozess ausgeführt werden, während in der MRT die GIL (auch mit den nativen Threads von 1.9) vorhanden ist, die die parallele Ausführung von Ruby-Code vermeidet.

Für einen Anwendungsentwickler ist dies das erste, was Sie bei der Betrachtung von JRuby beachten sollten, da es wirklich gut funktioniert config.threadsafe!, Sie jedoch sicherstellen müssen, dass Ihr Code (und Ihr Edelsteincode) "wirklich" threadsicher sind.

kares
quelle
7

Ich kann mich irren, aber ich denke, Sie können eine JRuby on Rails-App so verpacken, wie Sie es mit normalem RoR nicht können - schauen Sie sich Mingle oder ähnliches an. Ermöglicht den Verkauf, ohne die Hose fallen zu lassen oder den Komono zu öffnen.

Das heißt, ich bin nicht genug mit RoR-Verpackungen vertraut, also halte mich nicht daran fest :)

Nic Wise
quelle
1
Sie haben absolut Recht damit, obwohl Sie etwas wie den Edelstein Rawr oder Roir benötigen, um dies vollständig zu tun (als ich Mingle das letzte Mal verwendet habe, hatte es nicht verschleierte Ruby-Dateien ...).
Marnen Laibow-Koser
3

Meistens sollte es genauso funktionieren. In jRoR können Sie auf Dinge zugreifen, die Sie in RoR nicht hätten. Normalerweise handelt es sich hauptsächlich um ein Bereitstellungsproblem.

Wenn Ihre RoR-App jedoch native Bibliotheken verwendet, die kein Äquivalent haben, das auf der JVM ausgeführt wird, kann dies schmerzhaft sein. In den meisten Bibliotheken ist jedoch eine nicht native Version verfügbar (zumindest die populären, auf die ich gestoßen bin).

Michael Neale
quelle
0

Hier gibt es bereits einige gute Antworten.

eebbesen hat bereits die Grundlagen behandelt, und kares (er selbst!) hat uns mitgeteilt, dass JRuby keine GIL hat.

Aus praktischerer Sicht werde ich hinzufügen, dass ich Apps auf Ruby on Rails gestartet und dann aus Leistungsgründen auf JRuby migriert habe.

Es gab zwei Hauptvorteile bei der Leistung: JRuby ist (oder war) unter bestimmten Umständen einfach schneller als Ruby, und zweitens ermöglichte mir das Fehlen der Erwähnungen von Global Interpreter Lock kares Multithreading, was zwar knifflige, aber Leistungsvorteile in Größenordnungen freischaltete .

Eine sehr große Ruby on Rails-App wurde portiert und lief in einer Stunde, Edelsteine ​​und alles. Der einzige wirkliche Fehler war, dass sich Javas Regexe geringfügig von denen von Ruby unterscheiden. Das ist eine monumentale Leistung von JRuby.

user2057354
quelle