0xDEADBEEF

[RSS]
««« »»»

Java Ahead-of-Time Compiler

12. 3. 2020

Java od verze 9 nabízí (v ex­pe­ri­men­tální formě JEPu, od verze ±13 ne­ex­pe­ri­men­tálně) mož­nost ahead-of-time kom­pi­lace. Pří­slušný ná­stroj jaotc (po­sta­vený na kom­pi­lá­toru Graal) je při­pra­vený v re­po­zi­tá­řích De­bi­anu a Ubuntu (a nej­spíš i v dal­ších dis­tri­bucích s JVM 9+).

AOT kom­pi­lace má po­ten­ciál pomoci zvláště krát­kou dobu bě­ží­cím apli­ka­cím, které nedají JVM čas se plně zahřát a JITu pří­le­ži­tost vy­ge­ne­ro­vat efek­tivní kód. Jednu ta­ko­vou mám při ruce a shodou náhod ge­ne­ruje i tento blog (a mnoho dal­ších webů) — as­cii­blog.

Ge­ne­ro­vání celého webu k47.cz na oby­čejné JVM trvá 2550 ms. To budu brát jako vý­chozí bod pro další měření.

jaotc může kom­pi­lo­vat ve dvou módech: Jednak jako sta­tic­kou bi­nárku a pak jako bi­nárku pro tiered kom­pi­laci. Sta­tická verze nemůže využít nej­sil­nější zbraně C2 kom­pi­lá­toru – pro­fi­lo­vání, spe­ku­la­tivní op­ti­ma­li­zace a de­op­ti­mi­zace – a chová se, jako kdyby šlo o zkom­pi­lovné C++. Bi­nárka pro tiered kom­pi­laci v sobě ob­sa­huje in­frastruk­turu pro tyto kroky a nabízí tak to nej­lepší z obou světů – na jedné straně rych­lejší start a na druhé zá­ro­veň vysoký špič­kový výkon.

Nic ale není za­darmo. As­cii­blog, který má jako fat jar asi 7MB (ob­sa­huje celou stan­dardní kni­hovnu Scaly), po kom­pi­laci do sta­tické bi­nárky zabere 188 MB a do tiered bi­nárky do­konce 263 MB. Je to proto, že kom­pi­luje všechno, co v jaru najde a ne jen to, co na­ko­nec poběží.

Jak rychle tedy pro­gram běží s AOT kom­pi­lací? Vý­sledky jsou ná­sle­du­jící:

JVM2550 ms
jaotc non-tiered2150 ms
jaotc tiered2200 ms

Nějaký rozdíl tam bude, ale v tomto pří­padě ne příliš veliký.

Za­jí­mavý je také pohled na špič­kový výkon plně za­hřáté JVM:

JVM C2850 ms
jaotc non-tiered1300 ms
jaotc tiered830 ms

Závěry jsou dva:


Pozn:


K tématu:

píše k47 (@kaja47, k47)