Co zpomaluje Javu? A co překlad do nativního kódu?

Mysteriozni

Co zpomaluje Javu? A co překlad do nativního kódu?
« kdy: 11. 11. 2016, 20:38:32 »
Proc je Java priblizne 3x pomalejsi nez C++, cim je ta aplikace tak bzdena? A jde Javovska aplikace prelozit do nativniho kodu s rozumnymi vykonostnimi vysledky?

Pokud Javu brzdi nejvic garbage c., je mozne psat aplikaci s manualnim uvolnovanim zdroju jako v c++? Je k tomu nejaka dobra literatura?
« Poslední změna: 13. 11. 2016, 22:26:21 od Petr Krčmář »


javaman ((

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #1 kdy: 11. 11. 2016, 20:52:23 »
Tak třeba se tam dost věcí kontroluje. A rozhodně není vždy tak pomalá. Někde bude stejně rychlá a někde o něco pomalejší.

Do nativního kódu se normálně kompiluje, víc už to nejde. Proč myslíš, že je to tak rychlý?

GC rozhodně brzdí, to ale není chyba. Dá se třeba vypnout a vlastní implementace na míru je ideálním způsobem. Ne že bys to potřeboval, ale může se to hodit.

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #2 kdy: 11. 11. 2016, 21:01:47 »
Proc je Java priblizne 3x pomalejsi nez C++
Protože není. To tvrzení je nesmysl – úplně stejně můžete tvrdit, že je 6× pomalejší, 20× pomalejší, 3× rychlejší nebo 10× rychlejší, a bude to pořád stejně pravdivé tvrzení.

A jde Javovska aplikace prelozit do nativniho kodu s rozumnymi vykonostnimi vysledky?
Ano, dělá to každá rozumná JVM.

Pokud Javu brzdi nejvic garbage c., je mozne psat aplikaci s manualnim uvolnovanim zdroju jako v c++? Je k tomu nejaka dobra literatura?
Hloupostí si můžete navymýšlet nekonečně mnoho, takže nemůžete čekat, že ke každé z nich bude existovat dobrá literatura.

sss

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #3 kdy: 11. 11. 2016, 21:11:20 »
Proc je Java priblizne 3x pomalejsi nez C++, cim je ta aplikace tak bzdena? A jde Javovska aplikace prelozit do nativniho kodu s rozumnymi vykonostnimi vysledky?

Pokud Javu brzdi nejvic garbage c., je mozne psat aplikaci s manualnim uvolnovanim zdroju jako v c++? Je k tomu nejaka dobra literatura?
Java je pomala dokedy neprebehne ~20 000 iteracii toho isteho kodu a ona to neprelozi do nativneho kodu. Sama, bez tvojej asistencie. Predtym to zdrzuje analyza - co sa vola, ako casto sa to vola a co s tym. Potom je to bez alokacii / GC na urovni C++ kodu minus par percent na beh GC. O tom sa presvedcis v jednoduchom benchmarku.

Pisat aplikaciu s manualnym uvolnovanim zdrojov ako v C++ priamo nejde. Mozes do objektov priradzovat null, takze sa ti niekam nezatula referencia, ktora by drzala alokovane zdroje. Mozes znovupouzivat objekty. To je design anti-pattern, ale usetris na behu GC a doba behu bude stabilna napriec iteraciami.

Toto generuje vela garbage:
Kód: [Vybrat]
while (haveData()) {
   byte[] data = readDataOfConstantSize();
   processBigData(data);
}

Toto je rychlejsie, ale budes mat problem, ked data nebudu konstantnej velkosti. Ked citanie neuspeje, budes tam mat stare data:
Kód: [Vybrat]
byte[] data = new byte[getDataSize()];
while (haveData()) {
   readDataOfConstantSize(data);
   processBigData(data);
}

Kit

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #4 kdy: 11. 11. 2016, 21:41:31 »
...

Ten druhý přístup je vytažený z C/C++, do Javy vůbec nepatří.


Sten

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #5 kdy: 11. 11. 2016, 21:50:03 »
Ten druhý přístup je vytažený z C/C++, do Javy vůbec nepatří.

Ten druhý přístup používá třeba InputStream.read.

Marek

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #6 kdy: 11. 11. 2016, 23:23:02 »
IMHO Python je mnohem lepsi... :)

kimec

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #7 kdy: 11. 11. 2016, 23:32:44 »
Proc je Java priblizne 3x pomalejsi nez C++
No to by ma zaujimalo, ako ste namerali "priblizne 3x pomalsi". Microbenchmarking cez JMH vam asi nic nehovori. Keby Java bola taka katastrofa, asi by v nej nevznikol LMAX Disruptor, ktory sa pouziva v systemoch s "trochu" inymi narokmi na rychlost...

A jde Javovska aplikace prelozit do nativniho kodu s rozumnymi vykonostnimi vysledky?
Ano. Budete prekvapeny, ale funguje to velmi dobre a jednoducho. Robi sa to tak, ze Javovsku aplikaciu spustite.

IMHO Python je mnohem lepsi... :)
Hmm. Este aj ten Jython na JVM je rychlejsi ako CPython https://youtu.be/hLm3garVQFo?t=218  :-\

kimec

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #8 kdy: 12. 11. 2016, 00:11:25 »
Pokud Javu brzdi nejvic garbage c., je mozne psat aplikaci s manualnim uvolnovanim zdroju jako v c++? Je k tomu nejaka dobra literatura?
Ak vas toto najviac trapi, tak sa to robi tak, ze si naallokujete blok pamate mimo heap a spravujete si ho sami (marshal/unmarshal). Literatura nech je vam GitHub.

LArray
https://github.com/xerial/larray/blob/develop/larray-buffer/src/main/java/xerial/larray/buffer/DefaultMemoryAllocator.java#L72
OpenHFT
https://github.com/OpenHFT/Chronicle-Core/blob/f8e14cb2b5e7daed17dc6feba0a30284f3fae0d6/src/main/java/net/openhft/chronicle/core/UnsafeMemory.java#L124
Pre jednoduchsie pochopenie clanok na tuto temu od tvorcu LMAX Disruptora:
http://mechanical-sympathy.blogspot.sk/2012/10/compact-off-heap-structurestuples-in.html

Este k tej rychlosti, to HF v OpenHFT znamena HIGH FREQUENCY.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #9 kdy: 12. 11. 2016, 04:29:58 »
Proc je Java priblizne 3x pomalejsi nez C++, cim je ta aplikace tak bzdena? A jde Javovska aplikace prelozit do nativniho kodu s rozumnymi vykonostnimi vysledky?

Pokud Javu brzdi nejvic garbage c., je mozne psat aplikaci s manualnim uvolnovanim zdroju jako v c++? Je k tomu nejaka dobra literatura?
V podstatě jen jedna věc - alokace všeho na haldě (už se to tu řešilo). GC sám o sobě nevadí, Go má plně automatický GC a rychlostí je na úrovni C. Kdo zná Javu a jeden z moderních jazyků typu C(++), C#, Go nebo Swift, snadno napíše microbenchmark, co Javu roznese na kopytech. Jiná otázka pak je, nakolik se to projevuje v reálných úlohách. Tvůrci Javy si jsou problému vědomi, už plánují nápravu (v Javě 9 nebo 10). (GC je velkou brzdou jen v případě akutního nedostatku paměti, například při běhu na mobilech; pokud je k dispozici násobně více paměti než vyžaduje algoritmus, GC se na rychlosti neprojeví - toto je empirický akademický výsledek).

kimec

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #10 kdy: 12. 11. 2016, 09:03:09 »
Kdo zná Javu a jeden z moderních jazyků typu C(++), C#, Go nebo Swift, snadno napíše microbenchmark, co Javu roznese na kopytech.
Iste, ak vam ide o to, ako "roznest nejaky jazyk na kopytech", velmi rad si pozriem ako pobezi Bogosort rychlejsie v C ako v Jave. Kludne moze byt aj microbenchmark.

Dalsi idealny kandidat na rovnako kvalitny microbenchmarking je otvaranie a citanie suborov z disku/file systemu delegovanim volani kernelu. To bezpochyby ukaze, aky je ten ktory jazyk rychly. Vedlajsie efekty ako vlastnosti a implementacia file systemu, kernel schedulera alebo samotneho diskoveho media sa v teste vobec neodzrkadlia.

Pravdepodobne aj JMH vzniklo len preto, ze core vyvojari JVM nemali co robit.

Ked uz budeme pri tom testovani, tak vobec netreba zohladnovat fakt, ze JVM implementacii je hned niekolko (Oracle, IBM, Azul) pre rozne architektury, a ze existuju rozne implementacie zakladnych datovych struktur ako su Mapy, Listy, Sety atd. od roznych vendorov.

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #11 kdy: 12. 11. 2016, 09:42:08 »
Kdo zná Javu a jeden z moderních jazyků typu C(++), C#, Go nebo Swift, snadno napíše microbenchmark, co Javu roznese na kopytech.
V případě C/C++ to zcela jistě neplatí. Dnes používané JVM jsou totiž napsané právě v C/C++, takže každý výsledek běhu benchmarku pro Javu je zároveň i výsledkem pro C/C++. Asi budete oponovat, že se daná úloha dá v C/C++ napsat efektivněji, než že si vytvoříte vlastní jazyk, pro něj napíšete kompilátor a VM, a v tom jazyce pak tu úlohu vyřešíte. Ano, to je v mnoha případech pravda, zejména u microbenchmarků (a ve značné části reálných případů to pravda není, zejména pokud už ten jazyk a nástroje nutné pro běh vytvořil někdo před vámi – jak ukazuje obliba mnohých jazyků jako Java, Python, JavaScript, PHP a mnohé další). Jenže o efektivitě vy jste nic nepsal. (A také by záleželo na tom, která efektivita vás zajímá – paměťová při běhu programu, doba běhu programu, celková náročnost na zdroje, efektivita vývoje…) Vy byste prostě z množiny všech možných hloupých i dobrých řešení náhodně vybral jedno pro každý implementační jazyk, a ta byste porovnal. Výsledek by ovšem byl zcela náhodný a nevypovídá vůbec o ničem. Nanejvýš ho nějaký mysteriózní tazatel použije ve svém dotazu, když se mu nebude chtít generovat náhodné číslo – kolikrát je něco rychlejší nebo pomalejší – jiným způsobem.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #12 kdy: 12. 11. 2016, 11:23:11 »
Kdo zná Javu a jeden z moderních jazyků typu C(++), C#, Go nebo Swift, snadno napíše microbenchmark, co Javu roznese na kopytech.
V případě C/C++ to zcela jistě neplatí. Dnes používané JVM jsou totiž napsané právě v C/C++, takže každý výsledek běhu benchmarku pro Javu je zároveň i výsledkem pro C/C++. Asi budete oponovat, že se daná úloha dá v C/C++ napsat efektivněji, než že si vytvoříte vlastní jazyk, pro něj napíšete kompilátor a VM, a v tom jazyce pak tu úlohu vyřešíte. Ano, to je v mnoha případech pravda, zejména u microbenchmarků (a ve značné části reálných případů to pravda není, zejména pokud už ten jazyk a nástroje nutné pro běh vytvořil někdo před vámi – jak ukazuje obliba mnohých jazyků jako Java, Python, JavaScript, PHP a mnohé další). Jenže o efektivitě vy jste nic nepsal. (A také by záleželo na tom, která efektivita vás zajímá – paměťová při běhu programu, doba běhu programu, celková náročnost na zdroje, efektivita vývoje…) Vy byste prostě z množiny všech možných hloupých i dobrých řešení náhodně vybral jedno pro každý implementační jazyk, a ta byste porovnal. Výsledek by ovšem byl zcela náhodný a nevypovídá vůbec o ničem. Nanejvýš ho nějaký mysteriózní tazatel použije ve svém dotazu, když se mu nebude chtít generovat náhodné číslo – kolikrát je něco rychlejší nebo pomalejší – jiným způsobem.
Zcela jistě to platí. Psal jsem o konkrétním případě, kdy kód napsaný inteligentně pracuje s mnoha objekty alokovanými na zásobníku, což Java neumožňuje, pročež je řádově pomalejší. Už se to tu řešilo několikrát, kdysi dávno i s kódem, kterýžto byl důkazem, a naposledy tu jeden z mála inteligentních účastníků tohoto fóra s nekonečnou trpělivostí vysvětloval těm méně chápavým, proč tomu tak je (už nevím, jestli M.Prýmek nebo O.S.Nekola, ale to je fuk).

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #13 kdy: 12. 11. 2016, 11:53:33 »
Psal jsem o konkrétním případě, kdy kód napsaný inteligentně pracuje s mnoha objekty alokovanými na zásobníku, což Java neumožňuje, pročež je řádově pomalejší.
Asi máme každý jinou definici inteligentně napsaného kódu. Já bych třeba od inteligentně napsaného kódu očekával, že bude aspoň dělat to, co má. Java neumožňuje objekty alokovat na zásobníku, tudíž v Javě takový kód nemůže existovat. Neexistují kód bude nejen řádově pomalejší, bude dokonce nekonečněkrát pomalejší, nebude dělat nic – a podle mne to rozhodně není inteligentně napsaný kód.

Inteligentně napsaný kód podle mne nejen dělá, co má, ale navíc dobře využívá prostředků dané platformy. Takže nebudu posuzovat, zda ten kód dobře pracuje s mnoha objekty alokovanými na zásobníku, ale jak dobře dělá to, co dělat má. A pokud při tom používá mnoho objektů alokovaných na zásobníku, prosím, ať to tak dělá, ale je to nepodstatný implementační detail.

javaman ((

Re:Co zpomaluje Javu? A co preklad do nativniho kodu?
« Odpověď #14 kdy: 12. 11. 2016, 12:26:56 »
Psal jsem o konkrétním případě, kdy kód napsaný inteligentně pracuje s mnoha objekty alokovanými na zásobníku, což Java neumožňuje, pročež je řádově pomalejší.
Asi máme každý jinou definici inteligentně napsaného kódu.

+1

Už se to tu řešilo několikrát, kdysi dávno i s kódem, kterýžto byl důkazem, a naposledy tu jeden z mála inteligentních účastníků tohoto fóra s nekonečnou trpělivostí vysvětloval těm méně chápavým, proč tomu tak je (už nevím, jestli M.Prýmek nebo O.S.Nekola, ale to je fuk).

To je dobrý. Ty si najdeš někoho, kdo ty tvoje nesmysly vidí stejně a pak ho označíš za inteligentního :D To se mi líbí. Ty jsi samozřejmě také superbystrý, protože jinak bys to přece nemohl vidět stejně. Cool.