Proč je Java pomalá a problémová?



Makovec

Re:Proč je Java pomalá a problémová?
« Odpověď #16 kdy: 14. 12. 2013, 20:02:20 »
I cizí "velké" java aplikace mi dělají problémy více, než jiné (jdownloader, eclipse, android) pády, záseky, lagy... všude se to chová stejně "divně". Zdá se i zvláštní, že tyhle problémy jsou i po letech existence. Je snad nějaký zásadní problém už v konstrukci jazyka? Do hloubky tomu nerozuním, ale rád bych se dozvěděl více.

Zásadní problém je ten, že se Java používá na účely pro které nikdy nebyla určena a není na to vhodná. Hlavní motivace ke vzniku Javy bylo mít drobné aplikace v bytecode přenositelném beze změny mezi malými počítači, nebylo to zamýšleno na desktopové aplikace a už vůbec ne na molochy jako Eclipse.

Co se týká výběru, tak volba nástroje se provádí podle toho co chceš vyvíjet, například v C+ASM asi nebudeš dělat webové stránky.

No nevím, v roce 1995, vyvinutá Sun Microsystems... jaká přesně "malá zařízení" - možná tenké klienty? Je pravda že přenositelnost bytecode byla od začátku zásadním požadavkem. Ale nesalo se (protože se ty tenké klienty před tablety vůbec neujaly) Pokus udělat z toho univerzální jazyk pro programování mobilních aplikací taky ztroskotal - samotná myšleka profilů není špatná, ale problém je že je to přesně něco o co velcí hráči nemají skutečný (nemluvím o verbálním) zájem... stejně jako o HTML 5 a webové aplikace, mimochodem.

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Proč je Java pomalá a problémová?
« Odpověď #17 kdy: 14. 12. 2013, 20:31:02 »
Chápu, že interpretovaný jazyk bude vždy pomlejší. Ale subjektivně mi přišlo, že java, i když už je s námi velmi dlouho, je stále nejnefektivnější a nejproblémovější prostředí vůbec.

To je naštěstí pouze Tvůj subjektivní dojem. Zkus si něco o té platformě zjistit, Java není interpretovaný jazyk (kód se zkompiluje před zpuštěním aplikace, když se některá funkce provádí častokrát, tak se po čase zkompiluje s brutálními optimalizacemi a hot-swapne - sorry, ale tohle není interpretace).

Kdysi jsem v tom něco i programoval, ale vždycky to bylo takové divné.

Tato platforma (stejně jako každá jiná) má svá specifika (viz třeba kniha Java Puzzlers). Stejně tak fakt, že díky zpětné kompatibilitě jsou přístupná i zastaralá API (např. java.io -> java.nio -> java.nio2 pro práci se souborovým systémem), se v ní může ze začátku těžko orientovat. Pokud ta specifka neznáš nebo nevíš, která API jsou moderní a která ne a která spolu vycházejí dobře a která ne, může Tě to pěkně vyliskat a to se taky asi stalo :-) . Smutná zpráva je, že nejsi sám, naopak, znám armádu lidí, kteří jsou _placení_ za to, že je JVM/.Net vyliskává za jejich neschopnost a neznalost, čímž vytvářejí šílené prasárny a berou za to těžký prachy.

Např. nedávno jsem viděl, že architektovi přišlo, že třída mající 50.000 řádků C# kódu je příliš velká (byla to nějaká Utils třída - univerzální třída na všechno, anglicky se tomuto architektonickému vzoru říká "fucking big bucket of shit"), tak ji rozdělil do asi 10 partial class. Tohle je bohužel realita běžného korporátníhho života a dokud budou ze strany manažerů tlaky na co nejnižší cenu a manažeři nebudou problematice dostatečně rozumět (minulý týden jsem slyšel projekťáka z jiného oddělení, že "přímé přístupy do databáze ze zobrazovací vrstvy jeho týmu nikdy nepřinesly zvýšené náklady na údržbu, naopak zavedení návrhových vzorů jako MVC nesmyslně prodražilo projekt, protože developeří se museli s těmito vzory seznamovat a obcházet jejich nedokonalosti"), nebudou mít lidi motivaci se učit psát dobře a budou vznikat prasárny. A právě prasečiny jsou hlavním důvodem, proč jsou v případě Javy aplikace ze strany uživatele naprd.


Kolemjdoucí

Re:Proč je Java pomalá a problémová?
« Odpověď #18 kdy: 14. 12. 2013, 20:47:54 »
No nevím, v roce 1995, vyvinutá Sun Microsystems... jaká přesně "malá zařízení" - možná tenké klienty? Je pravda že přenositelnost bytecode byla od začátku zásadním požadavkem.

Java (neúspěšně) existovala již několik let před tím a teprve s myšlenkou užití na PC se dostala do širší známosti. Hlavní myšlenka použití Javy na PC bylo skriptování v prohlížeči, tam kde je dneska Javascript, ovšem bylo to fiasko nevídaných rozměrů.

Re:Proč je Java pomalá a problémová?
« Odpověď #19 kdy: 14. 12. 2013, 21:16:45 »
Proč je Java pomalá?

Nie je.

Proč je Java problémová?

Nie je.

--
Aspon nie viac, ako C alebo C++, kde treba robit optimalizacie a zmeny pre kazdu platformu.


noname

Re:Proč je Java pomalá a problémová?
« Odpověď #20 kdy: 14. 12. 2013, 22:24:45 »
Chápu, že interpretovaný jazyk bude vždy pomlejší. Ale subjektivně mi přišlo, že java, i když už je s námi velmi dlouho, je stále nejnefektivnější a nejproblémovější prostředí vůbec.

To je naštěstí pouze Tvůj subjektivní dojem. Zkus si něco o té platformě zjistit, Java není interpretovaný jazyk (kód se zkompiluje před zpuštěním aplikace, když se některá funkce provádí častokrát, tak se po čase zkompiluje s brutálními optimalizacemi a hot-swapne - sorry, ale tohle není interpretace).


Nechci se plést do flame, ale tohle mi nedalo. Vždy jsem všude četl, že je Java interpretovaný jazyk a překládá se do tzv. bytekódu, podíval jsem se na Wikipedii a ta se mnou souhlasí. Na druhou stranu také popisuje technologii JIT (o které jsem dosud nevěděl), která trošku odpovídá tomu co říkáte, ale ne vždy na Wikipedii bývá vše správně. Můžete fakt, že Java není interpretovaný jazyk trošku rozvést? Tohle by mě konkrétně docela zajímalo, protože jsem si vždy myslel pravý opak. Děkuji předem.

Tonda

  • *****
  • 631
    • Zobrazit profil
    • E-mail
Re:Proč je Java pomalá a problémová?
« Odpověď #21 kdy: 15. 12. 2013, 00:42:46 »
Program v Javě je v přenositelném bytekódu (nejen co se týče OS, ale i co se týče HW platformy - architektury CPU). Nicméně moderní JVM si za běhu exponované části kódu optimalizují a kompilují do nativního kódu.

Re:Proč je Java pomalá a problémová?
« Odpověď #22 kdy: 15. 12. 2013, 01:07:43 »
Neřekl bych, že existuje vyloženě špatnej programovací jazyk. Každý má svoje výhody a nevýhody.
Nevýhoda Javy určitě bude poměrně velká náročnost na systémové zdroje. Velká výhoda snadná přenositelnost kódu.

Co existuje zcela jistě jsou špatný frameworky, hotové komponenty a programátoři.
Já osobně bych se přiklonil k jazyku C, jenže to má smysl jen na core věci (protože není efektivní na vývoj).
Čím méně se část kódu používá - tím spíš může být v nějakém vysokoúrovňovém jazyce.
„Řemeslo se naučí každý. Umění nikdo.“
„Jednoduchost je nejvyšší úroveň sofistikovanosti.“
- Leonardo Da Vinci

iwtu

Re:Proč je Java pomalá a problémová?
« Odpověď #23 kdy: 15. 12. 2013, 03:35:42 »
Co se týká výběru, tak volba nástroje se provádí podle toho co chceš vyvíjet, například v C+ASM asi nebudeš dělat webové stránky.

Kámoš robí web v C++ http://cppcms.com/wikipp/en/page/main a mongodb, lebo táto kombinácia zvláda 3000 requestov sa sekundu a vývoj je iba 2x pomalší ako v Nette.

Pre autora. Skúsil si IntelliIdea namiesto Eclipse? :)

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Proč je Java pomalá a problémová?
« Odpověď #24 kdy: 15. 12. 2013, 10:14:53 »
Vždy jsem všude četl, že je Java interpretovaný jazyk a překládá se do tzv. bytekódu

Zjednodušeně: soubory s příponou .class, tedy to, co vyleze z kompilátoru, jsou bytecode. Je možné, že některé JVM se k něm chovají jinak, ale ta od Oraclu vždy při spuštění programu překládá bytecode do nativního kódu (JIT) dané platformy (proto trvá déle, než se program spustí) a také při běhu programu kritická místa optimalizuje.

Srovnej to PHP - tam se při každém spuštění probíhá celá kompilace znovu, u Javy je většina práce již hotová překladem do bytecodu.

Lol Phirae

Re:Proč je Java pomalá a problémová?
« Odpověď #25 kdy: 15. 12. 2013, 10:54:24 »
Protože je špína zažraná!!!  ;D

Re:Proč je Java pomalá a problémová?
« Odpověď #26 kdy: 15. 12. 2013, 11:35:54 »
Java bude pomalá a náročná, když se na ní budou provozovat věci, které jsou napsané nevhodným způsobem (Swing). I v takovém případě může být vhodnější než C. Nedávno jsem si kupoval IntelliJ IDEA Ultimate. Ano, je to aplikace ve Swingu a žere nějakou RAM. Ale kolik by stálo srovnatelné IDE v jazyce C?

Java bude pomalá, když se bude špatně používat. Například časté starty a ukončení v režimu server. (Na Oracle Javě pod x86_64 fakticky jediná možnost.) V režimu client bude taky pomalu startovat, když nebude fungovat Class Data Sharing (otázka jednoho příkazu po instalaci, ale na některých Linuxových distribucích to není/nebylo automatické). Ale start Javy, jakkoli se s tím dá bojovat, nebude asi nikdy rychlý. Leda na speciálních JVM (JamVM, Avian, na Androidu nově libart), ale je potřeba mít představu, kde jsou přednosti/slabiny těchto JVM. Někdy pro rychlost startu pomůže vynutit režim interpretu. Pokud jde o výkon, hlavní oblast Javy je v dlouho běžících aplikacích.

Například JRuby je pomalé, pokud jen na aplikaci zavoláme --help. U dlouhodobě běžících aplikací je ale prý typická optimalizace použít JRuby místo Ruby MRI.

Java bude žrát hodně RAM, pokud je ta RAM k dispozici a pokud se nenastaví velikost heapu. Měl jsem malou aplikaci, která hledala nějaké řešení nějakého problému. Potřebovala O(sqrt(n)) RAM vzhledem k době běhu (čistě vlastnost algoritmu). Doma mi po několika hodinách nežrala ani 100MiB. Na školním serveru to velmi rychle šlo do gigabajtů. Řešení bylo velmi jednoduché - nastavit pravidla pro heap. Na stroji se 128GiB RAM si totiž Java vzala velký heap...

Napsal jsem aplikaci s použitím Play frameworku a jako server jsem dočasně použil Raspberry Pi. (Starší verze s 256MiB RAM.) Prvně se odmítla spustit, protože výchozí heap byl asi 384MiB RAM. No co, nastavil jsem tomu 64MiB (s velkou rezervou, jak jsem zjistil později) a jelo to výborně. Nepoznal jsem subjektivně na výkonu, jestli to běží na notebooku, nebo na Raspberry Pi v místní síti. (Sice místo Javy byla použita z velké části Scala, ale pořád to je na JVM a výkonově je to velmi blízko.)

Naopak Owncloud s PHP-FPM a APC jel na Raspberry Pi dost pomalu. Pravda, zavání to hruškojablkem a je taky fakt, že PHP je prakticky univerzální odpověď na "Znáte něco pomalejšího?". Ale jako jeden z mnoha způsobů, jak ukázat, že Raspberry Pi není zrovna nejvýkonnější (jinde byl Owncloud OK, i na levné VPS), to stačí.

kuka

Re:Proč je Java pomalá a problémová?
« Odpověď #27 kdy: 15. 12. 2013, 13:28:12 »
Můžete fakt, že Java není interpretovaný jazyk trošku rozvést? Tohle by mě konkrétně docela zajímalo, protože jsem si vždy myslel pravý opak.

Java je interpretovana, protoze ke svemu behu potrebuje interpretr. Tento samotny fakt je ovsem na urovni diskuse zde zcela nepodstatny, protoze vetsina diskutujicich ma o jave v nejlepsim mlhave predstavy. Pomalost javy oproti C je v nekterych pripadech objektivni (napr. nelze pracovat v takove mire primo s alokovanou pameti) a v nekterych subjektivni - v jave je totiz schopny napsat fungujici program i programator, ktery by v C stezi sesmolil hello world a takovi obvykle nepisi efektivni algoritmy (a pak zadna JIT kompilace nepomuze). V neposledni rade jsou zde bumbrlicci typu Swing, s tim mam zkusenost minimalni, tak to nebudu hodnotit.

andy

Re:Proč je Java pomalá a problémová?
« Odpověď #28 kdy: 15. 12. 2013, 13:32:53 »
Java ma oproti nejakemu big ass kompilovanemu programu (office a pod) jednu nevyhodu - nedaju sa pamatovo mapovat .dll. Samotny microsoft ma tooly na optimalizaciu rozmiestnenia kodu, ked mozes napr. kod pouzivany pri starte umiestnit pri linkovani co najblizsie k sebe. Pri starte sa namapuje sice cele dll, ale vypadok nastane len pre par stranok. Su tam este ine optimalizacie na systemovej urovni.
Java naproti tomu musi otvorit jar a nacitat z neho triedu do pamate a zJITovat to. Toto sa myslim snazi riesit class sharing, ale je to podla mna polovicate riesenie, lebo tam nie su automaticky vsetky triedy vsetkych java aplikacii co pouzivas.
Dalsia vec je nastavenie pamate - zere to vela, ale stacilo by menej? Obmedzis heap, no problemo. Ale az to fakt bude potrebovat viac, tak sa to zacne zasekavat z castych behov GC, alebo to rovno padne.

Co sa tyka C/C++ -plati to co odznelo. Napr. chrome ma uz par rokov memory leak (vidiet to na notebooku ktory restartujem tak raz za 2 mesiace), openoffice sa pomaly startuje a oproti ms officu je celkovo molochovejsi, okrem toho tie aplikacie tiez obcas padaju. Pisat webserver v C? Preco nie. Pisat web aplikaciu v C? Koledujes si o memory leaky, buffer overflow chyby atd, bude ti to trvat dlhsie a kolko ludi skutocne potrebuje napisat web co zvlada 3000req/s?

Vit kolko si zhltne ten play? Nasiel som nejake cisla ktorym sa mi celkom nechcelo verit..

kuka: je rozdiel medzi interpretom a VM. VM je sw CPU. Zjavne mas o jave mlhave predstavy ty.

Re:Proč je Java pomalá a problémová?
« Odpověď #29 kdy: 15. 12. 2013, 13:45:50 »
Soubory *.class/*.jar (příp. *.dex/*.apk, princip je podobný) potřebují k běhu nějakou JVM, to ano. Ale to zdaleka nemusí být interpret. Jsou jiné možnosti:
* JIT - za běhu se to kompiluje do nativního kódu (běžně podporované v Oracle Javě)
* AOT - před spuštěním se to zkompiluje do nativního kódu (umí např. Avian, případně u "Androidí Javy" zmíněný experimentální libart na KitKatu, používají to také některé starší mobily s J2ME)
* nějaká kombinace (používá se na Oracle Javě)

K omezení heapu: dá se to nastavit i trošku dynamicky, kdy si aplikace v případě potřeby vezme víc. Je s tím rozšiřováním heapu sice nějaký overhead a na serveru bych spíš doporučil napevno, ale možné to je.

K Play2: V production mode výrazně méně. Záleží samozřejmě, co na tom chceš provozovat a s kolika uživateli. Mám ale pocit, že jsem to dostal i někam do řádově 10-15MB.

Na druhou stranu, v development mode (kde jsou v paměti i kompilátory, Rhino apod.) to může být třeba 1GB. Což na dnešních strojích nemusí být problém, ale píšu to, aby to nebylo nějaké překvapení.

Jinak i na Play1, které IMHO žere víc, mi žere víc MySQL než Play.