Vi skaber exe-programmer fra Java med GraalVM - og det kører forrygende hurtigt

13. december 2018 kl. 05:11
Vi skaber exe-programmer fra Java med GraalVM - og det kører forrygende hurtigt
Illustration: Bigstock/Pmm.art.
I hvert fald under Virtualbox, hvor exe-filer giver ydelsesforbedringer på 45 procent med Version2's test-kode.
Artiklen er ældre end 30 dage
Manglende links i teksten kan sandsynligvis findes i bunden af artiklen.

Oracle, der står bag Java-platformen, i hvert fald så vidt som at firmaet ejer varemærket, arbejder på en ny afviklingsplatform, med det pompøse navn GraalVM.

Det er en ny just-in-time compiler til JVM-verdenen, som fokuserer på ydelse og understøttelse af flere sprog. Twitter er blandt kunderne, men det firma bygger dog selv miljøet fra open source-kildekoden.

Java og JVM-platformen

Java er et programmeringsprog med en tilhørende virtuel maskine (JVM), som benyttes til at afvikle programmer kompileret til bytecode, en slags virtuelle cpu-instruktioner.

Det gør det muligt at flytte programmer på tværs af styresystemer og hardware-arkitekturer.

Andre sprog kan også kompileres til bytecode, og denne verden omtales ofte som JVM-platformen.

OpenJDK er en open source-version af Javas afviklingsmiljø. Der findes også andre open source-udgaver, såsom AdoptOpenJDK.

Udover Java kan Graal også klare sprog som Javascript, Ruby, Python og R. Graal kan også kompilere Java-kode ‘ahead-of-time’, hvor slutproduktet er eksekverbare filer, i stedet for Java-bytecode.

Oracle har flere gange nævnt i offentligheden, at det kan give hurtigere Java-programmer, men har til gengæld været lidt fåmælt på journalisters spørgsmål om, hvad der betinger den hurtigere programudførsel.

Derfor har vi spurgt Oracles hovedkvarter om, hvilke slags Java-programmer, der kan blive hurtigere.

Artiklen fortsætter efter annoncen

»Der er for mange variable i programkonstruktion til at forudsige, hvornår GraalVM er hurtigere end OpenJDK,« skriver teknisk direktør Eric Sedlar, Oracle Labs i et svar til Version2.

Men det er dog muligt at give nogle fingerpeg, nævner han. Det drejer sig om applikationer, der bruger Java 8-funktioner, som streams og lambda-udtryk, programmer eller biblioteker der er skrevet i Scala (såsom Spark, som Oracle nævner specifikt,) programmer der er intensive på data, og programmer med mange abstraktioner.

GraalVM på Ubuntu i Virtualbox

Graal er ankommet i version 1.0, men kun til Linux og Mac, indtil videre. Jeg benytter ikke Linux på min maskine, så jeg bruger virtualiseringsprogrammet Virtualbox til at køre Ubuntu oven på mit Windows-system.

Jeg har først prøvet Windows Subsystem for Linux, men det kan jeg ikke få til at spille sammen med Graal. Det tager dog ikke mange minutter at komme i gang med Virtualbox.

Artiklen fortsætter efter annoncen

I Ubuntu downloades og installeres GraalVM nemt med disse fire kommandoer i terminalen:

  1. $ curl -L https://github.com/oracle/graal/releases/download/vm-1.0.0-rc9/graalvm-ce-1.0.0-rc9-linux-amd64.tar.gz -o /tmp/graal
  2.  
  3. $ tar -zxvf /tmp/graal -C /tmp
  4.  
  5. $ sudo mv /tmp/graalvm-ce-1.0.0-rc9 /usr/lib/graalvm
  6.  
  7. $ export PATH=/usr/lib/graalvm/bin:$PATH

Til at teste med benytter vi kode fra Version2's machine learning-system, der gætter emneord til nye artikler. Det pågældende program har til formål at optimere en hyperparameter, og indlæser en stor mængde filer for derefter at foretage en del talknuseri.

Først oversætter vi Java-programmet til bytecode. Graal har JVM’en og dens værktøjer med i posen, så ingen ekstra krumspring er nødvendige. Vi compiler blot med den sædvanlige kommando:

  1. $ javac v2ml/OptimeretTraener.java

Derefter compiler vi bytecode-filerne (.class) til maskinkode med kommandoen

  1. $ native-image v2ml.OptimeretTraener

Det giver en meget lang fejlmeddelelse, der indeholder teksten

  1. ...fatal error: zlib.h: Ingen sådan fil eller filkatalog...

Den klarer vi ved at køre kommandoen

  1. $ sudo apt-get install libz-dev

Bedre fejlmeddelelser med flag

Nu sker der noget, men programmet stopper med en fejl - uden fejlkode eller andet, der kan lede på sporet. Internettet fortæller, at hvis vi tilføjer flaget --no-server skulle vi få en bedre fejlmeddelelse:

  1. $ native-image --no-server v2ml.OptimeretTraener

Nu får vi en fejlmeddelelse med nummeret 137, som jeg - helt usædvanligt - ikke kan finde oplysninger om på nettet ved søgning. Det skyldes nok Graals unge alder.

Imidlertid betyder Javas fejlkode 137 'out of memory,' og Graal er et Java-program, så mon ikke det er her, hunden ligger begravet. Vi sætter hukommelsen for Ubuntu-instansen op fra to til fire gigabyte i Virtualbox, og så går problemet væk.

Vi kører kommandoen igen og Graal kvitterer med at skabe en eksekverbar fil:

  1. v2ml.optimerettraener

– der fylder 8,7 megabyte. Ganske pænt ned fra Java 11-distributionens 285 megabyte.

Vi kan nu teste bytecode-udgaven op imod maskinkode-versionen. Til dette formål bruger vi time-kommandoen i Ubuntus terminal, som måler, hvor lang tid det tager at udføre et program.

Artiklen fortsætter efter annoncen

Bytecode-versionen kører vi således, på klassisk Java-maner:

  1. $ time java v2ml.OptimeretTraener

Maskinkode-udgaven kører vi således:

  1. $ time ./v2ml.optimerettraener

Det giver dette resultat, som er opsigtsvækkende - synes jeg da, i det mindste:

  1. real 0m22,048s
  2. user 0m18,859s
  3. sys 0m0,568s

og

  1. real 0m12,168s
  2. user 0m10,500s
  3. sys 0m0,282s

hvor real står for den faktisk forløbede tid, mens user og sys står for den CPU-tid, der kun bruges af processen.

Vores maskinkode-udgave slår altså bytecode-versionen med en reduktion i tid på 45 procent. Ganske imponerende.

Om resultatet er påvirket af forhold, der har at gøre med at vores Ubuntu kører under Virtualbox, skal vi dog ikke kunne sige.

Windows-version på vej

Der kan være ting i verden, der er vigtigere end ydelse. Blandt Graals øvrige smarte punkter er som nævnt integration med andre sprog, som tit har underliggende biblioteker skrevet i C.

Dertil kommer, at Java kompileret til exe-filer nemt kan kaldes fra C og C++-programmer og endeligt får man et slutprodukt, som kun indeholder det nødvendige, i modsætning til hele Javas afviklingsmiljø. (Det sidste kan dog også klares med værktøjet Jlink.) Det er smart til container-brug, hvor det sparer på diskpladsen og den tid, det tager at sætte applikationen i sving.

Ulemper er der også, naturligvis, blandt andet manglende platformsuafhængighed - der skal kompileres til enten Linux eller Mac - og dernæst kan programmer kun loade kode, som Graal har kigget på under kompilering. Men kan altså ikke loade kode via en classloader.

Andre begrænsninger i forhold til bytecode gennemgås på Graals hjemmeside. Og så er der som nævnt ikke rigtigt Windows-understøttelse endnu, men det skulle dog være på vej, forlyder det fra Oracle.

Ingen kommentarer endnu.  Start debatten
Denne artikel er gratis...

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.

Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.

Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.

Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.

Debatten
Log ind eller opret en bruger for at deltage i debatten.
settingsDebatindstillinger