JRuby on Rails kontra Ruby on Rails, jaka jest różnica?

135

Chcę wypróbować JRuby i JRuby on Rails. Mam problem ze znalezieniem informacji na temat różnicy między JRuby on Rails a Ruby on Rails.

Na jakie różnice muszę zwrócić uwagę?

epochwolf
źródło

Odpowiedzi:

160

JRuby to implementacja Rubiego, która działa na JVM, podczas gdy Ruby Matza to implementacja w C.

Najważniejsze cechy, na które należy zwrócić uwagę:

  1. JRuby działa na maszynach wirtualnych Java i jest kompilowany lub interpretowany do kodu bajtowego Java.
  2. JRuby może zintegrować się z kodem Java. Jeśli masz biblioteki klas Java (.jar), możesz odwoływać się do nich i używać ich z poziomu kodu Ruby za pomocą JRuby. Z drugiej strony możesz również wywołać kod JRuby z poziomu Java. JRuby może również korzystać z JVM i możliwości serwera aplikacji.
  3. JRuby jest zwykle hostowany na serwerach aplikacji Java, takich jak Sun's GlassFish lub nawet serwer sieciowy Tomcat.
  4. Chociaż nie możesz używać natywnych klejnotów Ruby z JRuby, istnieją implementacje JRuby dla większości popularnych bibliotek Ruby.

Istnieją inne różnice, które są wymienione na wiki JRuby:

user23117
źródło
Dziękuję, to odpowiada prawie na wszystko, czego szukałem. :)
epochwolf
4
och, i działa trochę wolniej niż 1,9
rogerdpack
1
Aby zobaczyć różnice w wydajności w JRuby on Rails, zaleca się posiadanie maszyny wielordzeniowej z wystarczającymi zasobami. Powolne zapytania do bazy danych mogą również spowodować wąskie gardło JRuby i spowodować, że będzie działał podobnie lub wolniej niż MRI na Railsach. JRuby wykorzystuje również znacznie więcej pamięci wstępnej niż MRI.
Joseph Ravenwolfe
Mamy zarówno ogromną wydajność przy używaniu jruby z Oracle over VPN (testy przebiegają bardzo wolno), jak i lokalnie (bez VPN), samo uruchomienie ruby, konsoli rails itp. Zajmuje 30 sekund + zamiast 3.
Michael Durrant
57

Dziwię się, że we wszystkich odpowiedziach na to pytanie brakuje kluczowej rzeczy, związanej z GIL .

Główna różnica, na którą należy zwrócić uwagę, zwł. w aplikacjach internetowych, takich jak te zbudowane w Railsach, jest prawdziwa współbieżność („Global Interpreter Lock” bezpłatnie). Kiedy dwa wątki są uruchomione (np. Obsługują 2 żądania użytkowników) z JRuby, są one w stanie działać jednocześnie w ramach jednego procesu, podczas gdy w MRI istnieje GIL (nawet z natywnymi wątkami 1.9), który unika wykonywania równoległego kodu Ruby.

Dla programisty aplikacji jest to pierwsza rzecz, o której należy pamiętać, rozważając JRuby, ponieważ naprawdę błyszczy, config.threadsafe!ale wymaga upewnienia się, że Twój kod (i kod klejnotów) jest „naprawdę” bezpieczny dla wątków.

kares
źródło
7

Może się mylę, ale myślę, że możesz spakować aplikację JRuby on Rails w sposób, którego nie możesz zrobić z normalnym RoR - spójrz na Mingle lub podobny. Umożliwia sprzedaż bez upuszczania spodni / otwierania komono.

To powiedziawszy, nie jestem wystarczająco zaznajomiony z opakowaniami RoR, więc nie zmuszaj mnie do tego :)

Nic Wise
źródło
1
Masz absolutną rację, ale będziesz potrzebować czegoś takiego jak klejnot Rawr lub Roir, aby to zrobić całkowicie (ostatnim razem, gdy użyłem Mingle, miał nie zaciemnione pliki Ruby ...).
Marnen Laibow-Koser
3

przeważnie powinno działać tak samo. w jRoR możesz uzyskać dostęp do rzeczy, których nie miałbyś w RoR. Zwykle jest to głównie problem związany z wdrożeniem.

Jeśli jednak Twoja aplikacja RoR korzysta z natywnych bibliotek, które nie mają odpowiednika działającego na JVM, może to być uciążliwe. Jednak większość bibliotek ma dostępną wersję inną niż natywna (przynajmniej te popularne, z którymi się spotkałem).

Michael Neale
źródło
0

Jest tu już kilka świetnych odpowiedzi.

eebbesen omówił już podstawy, a kares (sam!) powiedział nam, że JRuby nie ma GIL.

Dodam z bardziej praktycznej perspektywy, uruchomiłem aplikacje na Ruby on Rails, a następnie migrowałem do JRuby ze względu na wydajność.

Istniały dwie główne korzyści związane z wydajnością: JRuby jest (lub był) po prostu szybszy niż Ruby w niektórych okolicznościach, a po drugie, brak wzmianek o Global Interpreter Lock Kares pozwolił mi na wielowątkowość, która, choć trudna, odblokowała rzędy wielkości korzyści w zakresie wydajności .

Bardzo duża aplikacja Ruby on Rails została przeportowana i uruchomiona w ciągu godziny, klejnoty i wszystko. Jedyną rzeczywistą usterką było to, że wyrażenia regularne w Javie są nieco inne niż w Rubim. To monumentalne osiągnięcie ze strony JRuby'ego.

user2057354
źródło