« GraalVM est une machine virtuelle universelle pour exécuter des applications écrites en JavaScript, Python, Ruby, R, les langages qui s’appuient sur la JVM comme Java, Scala, Kotlin et les langages LLVM comme C et C++, » peut-on lire sur le site du projet.
Qu’en est-il réellement du niveau de performances et d’interopérabilité que cet outil permet d’atteindre ? Un test indépendant apporte la lumière, notamment, sur l’un des cas d’utilisation prévus par le géant des bases de données : la génération de binaires natifs, c’est-à-dire destinés à être directement exécutés par une architecture particulière de processeur.
Le test proposé porte sur la comparaison des performances entre l’application ligne de commande RawHTTP (tournant sur la JVM) et la version native obtenue avec la machine virtuelle GraalVM. Dans les chiffres, l’application client native permet d’émettre une requête HTTP et d’afficher le résultat en moins de 30 millisecondes. En comparaison, il faut pratiquement dix fois plus de temps à l’application Java pour accéder à la même ressource. L’auteur du test a consigné les résultats pour une requête GET au sein d’un tableau récapitulatif dans lequel on peut voir que l’application native exhibe des performances qui, sous certaines conditions, peuvent battre celles obtenues en faisant usage d’un outil comme curl.
Mémoire (Mo) | Temps de démarrage (ms) | Temps de réponse (ms) | |
curl | 4,93 | 10 | 38 |
java -jar | 37,57 | 340 | 318 |
Image native | 4,84 | 10 | 28 |
L’application native serveur exhibe elle aussi des performances de gain notables en comparaison à la version Java et un serveur Apache. Le tableau récapitulatif consigne l’empreinte mémoire utilisée dans chacun des cas, ainsi que le temps de démarrage et la charge de travail.
Mémoire | Temps de démarrage (ms) | Nombre moyen de requêtes par seconde | |
Serveur Apache | Inconnu | 530 | 1241,16 |
java -jar | 68,07 | 568 | 794,57 |
Image native | 16,12 | 68,3 | 1719,19 |
Grosso modo, l’outil semble tenir les promesses faites par Oracle. Il faudra seulement noter qu’il n’est pas encore prêt pour un usage dans la majorité des cas. Le compilateur de binaires natifs est encore frappé par certaines limitations : il ne prend pas correctement l’API de réflexion et les paquetages Java de sécurité pour le moment.
Les tests sont entièrement reproductibles. Il faudra s’assurer d’avoir Java SE 8+ installé sur son système. L’application Java est disponible au sein de l’archive rawhttp.jar. Pour les besoins du test du client sous Linux, notamment, pour savoir quel est son temps de démarrage, il faudra jongler avec le code qui suit en remplaçant les gdate avec date, sinon le code ne tournera que sur OS X.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/bin/bash # command that tests that the server is accepting connections CMD="curl localhost:8082 >& /dev/null" START_TIME=$(gdate +%s%3N) # start the server ../rawhttp serve . -p 8082 & SERVER_PID=$! STEP=0.001 # sleep between tries, in seconds TRIES=500 eval ${CMD} while [[ $? -ne 0 ]]; do ((TRIES--)) echo -ne "Tries left: $TRIES"\\r if [[ TRIES -eq 0 ]]; then echo "Server not started within timeout" exit 1 fi sleep ${STEP} eval ${CMD} done END_TIME=$(gdate +%s%3N) TIME=$(($END_TIME - $START_TIME)) echo "Server connected in $TIME ms" #./rawhttp send -t "GET localhost:8082/hello" kill ${SERVER_PID} |
Sources : sites.google, GitHub
Et vous ?
Quelle crédibilité accordez-vous aux résultats de ces tests ? Avez-vous personnellement testé cette machine virtuelle depuis l’annonce de sa disponibilité ? Si oui, quel retour pouvez-vous faire ?
Voir aussi :
GraalVM : Oracle annonce une machine virtuelle polyglotte conçue pour supporter plusieurs langages sans sacrifier la performance