JRuby

Przy okazji dyskusji nad Rails 2.0 pojawił się wątek poboczny dotyczący wydajności implementacji Rubiego w Javie czyli JRuby. Otóż - pomimo tego, że w wielu testach JRuby był lepszy od MRI, to wydajność Railsów była jednak na nim gorsza.

Jedną z przyczyn tego stanu rzeczy była kiepska implementacja wyrażeń regularnych w bibliotece JRegex, który dotychczas wykorzystywana była w JRuby.

Sytuacja ta jednak najwyraźniej szybko się zmieni, na lepsze dla JRubiego. Otóż Marcin Mielczynski (czy ktoś zna tę postać osobiście, bo nazwisko brzmi znajomo :slight_smile: dokonał portu biblioteki wyrażeń regularnych Onigurama na Jave - Joni. Z postu Ch. Nuttera wynika, że wydajność nowej biblioteki jest nawet 30 krotnie lepsza niż poprzedniej! (testy dla biblioteki REXML).

Co więcej, z innego postu tego samego autora wynika, że uruchomienie JRuby na JVM 6 (dokładnie jej portu na Leoparda) powoduje, że wyniki testów operujące głównie na liczbach (cg. Fibonacciego, odwracanie macierzy) są lepsze dla JRubiego niż dla Rubiego 1.9!

Nie wiem jak dla was, ale dla mnie JRuby to przyszłość Rubiego.

No a kiedy będzie to częścią “rylisa” dla mnie to niezły krok naprzód :slight_smile: a jak sie ma wydajność JRuby z IronRuby ?

Z tego co wiem, to IronRuby nie jest jeszcze pełną implementacją Rubiego (na pewno brakuje implementacji części biblioteki standardowej, np. yaml), więc trudno byłoby porównać wydajność Railsów po IronRuby, bo po prostu nie pójdą.
Jeśli zaś chodzi o ogólną wydajność, to IronRuby póki co nie pojawił się na http://shootout.alioth.debian.org/gp4sandbox/, a JRuby już tam jest od jakiegoś czasu.

Wydaje mi się, że główną zaletą JRuby jest to że jego powiązania z Javą mogą złamać opór sektora ‘enterprise’ przed użyciem Rails w komercyjnych projektach. Java ma w tym środowisku wyrobioną markę i zaproponowanie klientowi aplikacji odpalanej na Glassfishu i łączącej się do bazy przez jdbc ma o wiele większe szanse powodzenia niż zaproponowanie mu aplikacji serwowanej przez apacha i mongrele. Wszystko zgodnie z hasłem “podobają mi sie tylko te piosenki które już słyszałem” (sam programuje głównie w javie od kilku lat:) )

Dla zainteresowanych tematem polecam bloga:
http://ola-bini.blogspot.com/

Ciekawy świeżutki wpis Martina Fowlera:
http://martinfowler.com/bliki/GroovyOrJRuby.html

Mała poprawka: Marcin Mielżyński. Znany jako lopex (często można spotkać jego komentarze na blogach), można z nim pogadać na IRCu (kanały jruby, rubyonrails.pl i inne ;)). Chłopak ma niesamowitą wiedzę i zapał do pracy - tylko podziwiać. Przez ostatnie dni implementował właśnie wspomnainy port Oniguramy do Javy - JOni. Wszystko z naciskiem na regexpy. Wiem to, bo czasem zaglądałem na kanał #jruby i widziałem dyskusje chłopaków (najbardziej udziela się olabini, lopex i headius ;)).

Co do JRubiego. To bardzo, bardzo ważny projekt. Zarówno dla nas, rdzennych Rubbistów (:D) jak i Javowców (oni jeszcze o tym nie wiedzą, ale jestem prawie pewien, że już niedługo docenią (J)Rubiego). Wydawać by się mogło, że w najprostszym ujęciu JRuby umożliwia używanie całego Java API w kodzie Rubiego. Czyli łączymy piękno i prostotę pisania w Rubym z tym co Java ma najlepsze - cały ‘code base’ (API + bilbioteki, a nawet i całe frameworki). Odrzucamy oczywiście to czego w javie nie lubimy - toporność. Nawet jeśli użycie samego API wiąże się z niewygodą to można to zmienić, dzięki elastyczności Rubiego. Już powstają takie projekty, które bazując na powiedzmy Swingu budują na nim ładniejszy i wygodniejszy w użyciu kod (np. zamiast implementacji przez klasę interfejsu listenera i dodawaniu go do listy słuchaczy robimy coś takiego: button.on_click { puts “clicked” }).

Jest to obustronna (java vs ruby) korzyść. My powiemy: fajnie, mogę użyć biblioteki Javy w moim kodzie (bo np jakiegoś liba brakuje w czystym Rubym). Programista Javy powie: hm, może jednak skuszę się na Rubiego, skoro nie muszę rezygnować z całego API Javy, którego uczyłem się po nocach ;).

Kolejna sprawa - wydajność. Bodajże Ruby 1.6 był tragicznie wolny i pomimo sporego skoku wydajności w wersji 1.8, nadal ciąży na nim ta kwestia ;). Najbardziej na wydajność narzekają Ci… którzy Rubiego nie używają (i nie rozumieją 2 kwestii: mózg ludzki jest cenniejszy niż bezduszna maszyna, jeśli wydajność jest kwestią kluczową to Ruby nie jest właściwym wyborem). My oczywiście nie obrazilibyśmy się gdyby dało się trochę naszego Rubiego pszyspieszyć. Na horyzoncie widać już Ruby 1.9, który na pewno będzie szybszy od poprzedniej wersji. Jednak JRuby już pokazuje, że aspiruje do bycia najszybszym. A to wszystko dzięki technologii JIT, która w trakcie działania programu potrafi go optymalizować, np poprzez kompilację bezpośrednio do kodu maszynowego “gorących” miejsc. Co ciekawe operacje na liczbach już teraz potrafią być szybsze w JRuby, a będą prawdopodobnie jeszcze szybsze! W obecnej chwili każda liczba jest pełnoprawnym obiektem Javy. W przyszłości JRuby będzie prawdopodobnie potrafił reprezentować liczby jako prymitywy (tak gdzie może na to sobie pozwolić) dzięki czemu operacje na liczbach mogą drastycznie przyspieszyć.

W tym miejscu chciałbym jeszcze zwrócić uwagę na inne implementacje Rubiego. Są to m.in. http://rubini.us/, http://cardinal2.rubyforge.org/, http://www.ironruby.net/, http://rubydotnet.googlegroups.com/web/Home.htm, http://xruby.com/default.aspx. Z jednej strony strony programiści tych implementacji rywalizują ze sobą (raczej po cichu), z drugiej wymieniają doświadczenie ze sobą itp. Przykładowo w Rubinius i JRuby duży nacisk położono na testy (zgodność z MRI), dzięki czemu już powstała inicjatywa zebrania tych testów w jednym miejscu a także wyszła prośba do Matza by taką specyfikację przygotował :smiley: (do tej pory taką specyfikacją był kod C MRI;)) To może wyjść tylko na dobre Rubiemu. Jeśli oficjalnie JRuby będzie uznawany za najszybszą implementację to myślę, że japończycy zrobią wszystko by wersja w C dogoniła go i być może zaimplementują jakiś mechanizm JIT (do tej pory nic o tym nie słychać). Jest współpraca, jest rywalizacja (bardzo zdrowa) - jest fajnie :).

To co napisał @piachoo jest bardzo ważne. Po pierwsze Java to prestiż (chociaż nie przepadam za facetami w gajerkach…). Ale to jeszcze nic. Za JRubym w zasadzie stoi Sun (Charles Nutter i zdaje się jeszcze jeden z programistów został zatrudniony przez Sun). Z kolei IronRuby tworzy programista Microsoftu (jeśli nic nie pomyliłem to twórca IronPythona). To już jest dowód na zainteresowanie sektora enterprise Rubym.

Coś jeszcze? Choćby i prostota pisania rozszerzeń - piszemy przecież w Javie, a chyba każdy się zgodzi, że pisze się w niej o wiele przyjemniej niż w C ;). “Naprawiony” model wielowątkowy (zamiast green threads mamy pełnoprawne wątki).

A jakie widzicie ewentualne minusy/zagrożenia ?

Na pewno kwestia rozszerzeń. Te pisane w C w JRubym są bezużyteczne - nie ma możliwości ich użcyia (raczej logiczne). Zastanawia mnie także, czy jeśli (J)Ruby przebije tą “enterprisową” ścianę, Ruby pod naciskiem społeczności, firm nie zacznie zbaczać z dotychczasowej ścieżki. Ale nie ma co się martwić na zapas. Zawsze można przecież skopiować własną wersję źródeł Rubiego. Tak na wszelki wypadek ;).

Z problemów z JRubim należy jeszcze wymienić kontynuacje.

Widziałem prezentację dotyczącą web-frameworku napisanego w Smalltalku (Seaside), który był oparty na tym mechanizmie i przyznać należy, że wyglądał całkiem fajnie. Mały problem polega na tym, że 1 użytkownik to ok 1 MB ramu. W tym wypadku skalowalność może być problematyczna.

Tak więc dla mnie kontynuacje to raczej niewielka strata.

A co do integracji Rubiego z Javą, to zastanawiam się nad możliwością pisania wtyczek do Eclipse w Rubim - to byłoby coś! Muszę sprawdzić jak to wygląda w tej chwili (w szczególności w kontekście SWT).

http://www.rubyinside.com/fresh-new-ruby-implementation-benchmarks-so-whos-fastest-666.html Now benchmarki implementacji.

Jeśli moge dorzucic swoje trzy grosze to:

  1. Instalacja JRubiego i Railsow na glassfisu http://paulszulc.blogspot.com/2008/05/ruby-on-rails-na-glassfishu.html
    oraz
  2. Moje krótkie przemyślenia po co nam JRuby http://paulszulc.blogspot.com/2008/05/po-co-nam-jruby.html

Jestem swiezy w community, jesli ktos sie ze mna nie zgadza (zwlaszcza ktos obyty w temacie) w tych moich wypocinach to chetnie poslucham