JRuby on Rails vs. Ruby on Rails, qual è la differenza?


135

Sto cercando di provare JRuby e JRuby su Rails. Ho difficoltà a trovare informazioni sulla differenza tra JRuby on Rails e Ruby on Rails.

Quali sono le differenze che devo cercare?

Risposte:


160

JRuby è l'implementazione di Ruby che gira su una JVM mentre il Ruby di Matz è un'implementazione in C.

Le caratteristiche principali da notare sono:

  1. JRuby funziona su VM Java ed è compilato o interpretato in base al codice byte Java.
  2. JRuby può integrarsi con il codice Java. Se si dispone di librerie di classi Java (.jar), è possibile fare riferimento e usarle dal codice Ruby con JRuby. Nella direzione opposta è anche possibile chiamare il codice JRuby da Java. JRuby può anche utilizzare le funzionalità JVM e del server delle applicazioni.
  3. JRuby è generalmente ospitato all'interno di server di applicazioni Java come Sun's GlassFish o persino il server Web Tomcat.
  4. Sebbene non sia possibile utilizzare gemme native di Ruby con JRuby, esistono implementazioni JRuby per la maggior parte delle librerie Ruby popolari.

Ci sono altre differenze che sono elencate nel wiki JRuby:


Grazie, questo risponde a tutto ciò che stavo cercando. :)
epochwolf,

4
oh, e funziona un po 'più lentamente dell'1.9
rogerdpack

1
Per vedere le differenze di prestazioni in JRuby on Rails, si consiglia di disporre di una macchina multicore con risorse sufficienti. Le query lente del database possono anche strozzare JRuby e causare prestazioni simili o più lente della risonanza magnetica su Rails. JRuby utilizza anche una quantità di memoria iniziale significativamente maggiore rispetto alla risonanza magnetica.
Joseph Ravenwolfe,

Abbiamo sia prestazioni massicce con l'utilizzo di jruby con Oracle su VPN (i test si svolgono incredibilmente lentamente) sia anche localmente (senza VPN) solo l'avvio di ruby, console rails, ecc. Richiede 30 secondi + invece di 3.
Michael Durrant,

57

Sono sorpreso che manchi qualcosa di cruciale in tutte le risposte a questa domanda, relative a GIL .

La differenza principale di cui dovresti preoccuparti esp. nelle applicazioni web come quelle costruite con Rails è vera concorrenza ("Global Interpreter Lock" gratuito). Quando due thread sono in esecuzione (ad esempio, servono 2 richieste utente) con JRuby sono in grado di funzionare contemporaneamente all'interno di un singolo processo, mentre in MRI c'è il GIL (anche con i thread nativi di 1.9) che evita di eseguire il codice Ruby in parallelo.

Per uno sviluppatore di applicazioni questa è la prima cosa da tenere a mente mentre considera JRuby, poiché brilla davvero config.threadsafe!ma richiede che tu assicuri che il tuo codice (e il tuo codice gemme) sia "veramente" sicuro per i thread.


7

Potrei sbagliarmi, ma penso che puoi impacchettare un'app JRuby su Rails in un modo che non puoi fare con il RoR normale: guarda Mingle o simile. Permette di vendere senza far cadere i pantaloni / aprire il komono.

Detto questo, non ho abbastanza familiarità con l'imballaggio RoR, quindi non trattenermi :)


1
Hai assolutamente ragione su questo, anche se avrai bisogno di qualcosa come la gemma Rawr o Roir per farlo completamente (l'ultima volta che ho usato Mingle, aveva file Ruby non offuscati ...).
Marnen Laibow-Koser,

3

per lo più dovrebbe funzionare allo stesso modo. in jRoR puoi accedere a cose che non avresti in RoR. Di solito è principalmente una preoccupazione di spiegamento.

Tuttavia, se l'app RoR utilizza librerie native che non hanno un equivalente in esecuzione sulla JVM, ciò può essere un problema. Comunque la maggior parte delle librerie ha una versione non nativa disponibile (almeno quelle popolari che ho incontrato).


0

Ci sono già delle ottime risposte qui.

eebbesen ha già trattato le basi e kares (se stesso!) ci ha detto che JRuby non ha GIL.

Aggiungerò da una prospettiva più pratica, ho lanciato app su Ruby on Rails e poi migrato su JRuby per motivi di prestazioni.

Ci sono stati due principali vantaggi in termini di prestazioni: JRuby è (o era) semplicemente più veloce di Ruby in alcune circostanze, e due, la mancanza delle citazioni di Global Interpreter Lock mi ha permesso di fare il multithreading, che, sebbene complicato, ha sbloccato ordini di prestazioni di grandezza .

Un'app di Ruby on Rails molto grande è stata portata e funzionante in un'ora, gemme e tutto il resto. L'unico inconveniente era che le regex di Java sono leggermente diverse da quelle di Ruby. È un risultato monumentale da parte di JRuby.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.