XobotOS: Android w C# i Mono działa kilka razy szybciej niż w Javie
Google zdecyduje się na zmiany?
Mimo iż Google odniosło ogromny sukces ze swoim mobilnym systemem operacyjnym Android, to istnieją kwestie wciąż uprzykrzające życie przeglądarkowemu gigantowi. Mowa o powolnym działaniu, czy rzekomym naruszeniu patentów Javy. Receptą na te przypadłości może być system XobotOS, czyli port Androida w C# przygotowany przez Xamarin.
Niegdyś deweloperzy obecnie najpopularniejszego mobilnego systemu operacyjnego jakim jest Android, rozważali możliwość zastosowania w swoim dziele projektów zgodnych z normami ISO, a więc platform językowych .NET i C#.
Była to o tyle ciekawa koncepcja, gdyż Microsoft udostępnił tą pierwszą opcję z gwarancjami braku roszczeń patentowych w przypadku jej wykorzystywania. Mimo wszystko ostatecznie pozostano przy obecnej do dzisiaj w zielonym robociku Javy.
Java za czasów kiedy za jej rozwój odpowiedzialna była firma Sun mogła być wykorzystywana niemalże w dowolnych zastosowaniach, jednak po przejęciu Sun przez Oracle sytuacja zmieniła się diametralnie. Oracle wytoczyło wielkie działa przeciwko Google, twierdząc, że w Androidzie doszło do złamania petentów Java.
Od jakiegoś czasu spory między Oracle i Google przeniosły się na wokandę sądową i obecnie przypominają prawie telewizyjnego "tasiemca" - od zakazu sprzedaży poprzez licencjonowanie po ogromne tantiemy ze sprzedaży.
Firmę Xamarin stworzyli deweloperzy projektu Mono powiązani z firmą Novell. Przedsięwzięcie mimo istnienia stworzonego przez Microsoft projektu .NET, nabiera tempa i popularności, a to głównie z powodu udostępnienia projektu Microsoftu na licencji shared source, co oznacza sprzeczność z ideą wolnego oprogramowania i zabrania wykorzystania do wielu celów komercyjnych.
Idea Mono zakłada stworzenie narzędzi w pełni kompatybilnych z .NET, działających pod kontrolą możliwie największej możliwej liczby systemów operacyjnych. Dlatego też ostatnio powstały nawet wersje Mono dla Androida i iOS a wiec Mono for Android oraz MonoTouch, ale nie to jest dzisiejszym tematem.
Twórcy Mono w wolnych chwilach zajęli się przygotowaniem portu systemu Android 4.0 do C# za pomocą Mono. Oficjalnie miało to pomóc w usprawnieniu Androidowej wersji Mono.
XobotOS, chociaż jest jeszcze w bardzo wczesnej fazie prac, to już jak informują jego twórcy cały kod Javy z Androida został przeportowany do C#, a jego źródła zostały udostępnione społeczności na zasadzie licencji Apache.
Cały kod był tłumaczony maszynowo, za pomocą automatycznego narzędzia Sharpen, którego deweloperzy poddali licznym modyfikacjom aby poradził sobie z ogromem kodu zawartym w Androidzie. Jednak część kodu, niezrozumiała dla maszyny, bądź stwarzającej problemy logistyczne, składniowe bądź wydajnościowe została przetłumaczona ręcznie przez programistów.
Deweloperzy Mono i twórcy XobotOS
Po skompilowaniu przygotowanego kodu, okazało się, że przygotowana maszyna wirtualna z Mono jest znacznie wydajniejsza niż maszyna Java - Dalvik obecna w Androidzie. Sam system jest bowiem w takich warunkach w wielu środowiskach kilkakrotnie szybszy niż Android. Lepsza optymalizacja, większa responsywność oraz usprawnienia wprowadzone przez Microsoft do .NET pozwoliły zostawić w tyle Javę. Zdaniem deweloperów Java jest lata świetlne za C# i Google powinno nad tym się zastanowić.
Jeżeli Google odniosłoby porażkę w sporze z Oracle, to całkiem możliwe mogłoby być przeniesienie Androida właśnie do C# i Mono. Zarówno Google pozbyłoby się sporów patentowych, a system dostałby nagle przyśpieszenia. Jednak to wciąż tylko spekulacje, lecz nikt nie wyklucza, że pracami nad XobotOS może zająć się społeczność przenosząca system na smartfony z Androidem.
Jeśli interesuje was XobotOS to jego źródła możecie znaleźć na GitHubie.
Więcej o Java i Android:
- System Google Android zagrożony: Google przegrało proces z Oracle
- Oracle żąda 2,6 mld od Google za złamane patenty
- System Google Android może zniknąć z rynku
- Google nabywa kolejne patetny od IBM - zbroi się i chroni partnerów
Źródło: Xamarin, GitHub, Engadget, ZDnet, Arstechnica, SlashGear, TechieBuzz, theinquirer
Komentarze
56Kod testowy :
int c = 102030405;
int[] i = new int[c];
for (int j = 0; j < c; j++) {
i[j] = j;
}
long time = System.currentTimeMillis();
int w=0;
for (int j = c-1; j > 0; j--) {
if(i[j] < 0){
i[j] = w;
}
w = i[j];
}
time = (System.currentTimeMillis() - time);
System.out.println("Time : " + time);
Język Czas wykonania
C++ 2 ms
Java 60 ms
Scala 132 ms
C# 160 ms
Haskell 480 ms
Poza tym nie tylko kompilator odgrywa tu role, więc jeszcze sporo testów nad nami by w ogóle można by myśleć o zmianie języka, bo to, że te parę testów wyszło na plus dla MONO to za dużego znaczenia nie ma.
Z Twoim kodem jest taki problem, że niektóre kompilatory go w ogóle nie wykonają (zawartość tablicy nie jest nigdzie wykorzystywana). Podejrzewam, że kompilator C++ właśnie tak zrobił. Mógłbyś pokazać kod Haskella? Trochę mnie dziwi wynik, bo GHC jest bardzo szybki. Zresztą z powodu leniwej ewaluacji to wynik powinien wynosić góra kilka milisekund, a nie 480.
Z drugiej strony kod w haskellu faktycznie musiał się bardzo różnić bardzo mocno bo tam niestety/stety (zbędne skreślić) kod musi być całkowicie funkcyjny więc nie ręcze za jego obiektywność. Znalazł się tam jako punkt odniesienia. Gdyż podobnie jak C++ jest natywny lecz jest bardziej funkcyjny niż nawet Scala (Monady !) - więc dość dobrze oddaje jak wiele rzeczy możne mieć wpływ na wydajność.
http://shootout.alioth.debian.org/u64q/benchmark.php?test=all&lang=java&lang2=gpp
http://shootout.alioth.debian.org/u64q/benchmark.php?test=all&lang=java&lang2=csharp
http://shootout.alioth.debian.org/u64q/benchmark.php?test=all&lang=java&lang2=scala
http://shootout.alioth.debian.org/u64q/benchmark.php?test=all&lang=java&lang2=ghc
Dość dobrze to ilustruje generalną zasadę.