:: Enseignements :: ESIPE :: E5INFO :: 2020-2021 :: Machine Virtuelle (et bazar autour ...) ::
[LOGO]

All you wanted to know about Runtimes


Le but est de créer collectivement un ensemble de slides (30 slides de concepts + 25 par runtime) présentant dans un premier temps, les optimisations classiques fait par un runtime (JIT) en se foclisant sur l'optimisation des boucles et des appels de methodes, puis chaque runtime et les optimisations spécifique de chaque runtime. et enfin de montrer l'impact de ses optimisations sur 2 benchmarks.
Mercredi 11 Novembre: rendu des slides

Le premier benchmark consiste à calculer la somme d'un tableau d'entier d'un million de valeurs entre 0 et 100 (non compris). Le second benchmark consiste à calculer la somme d'un tableau d'objet (des A et des B chaque classe contenant un seul champ).
En Java, cela donnera à peu près
   sealed interface I { int value(); }
   record A(int value) implements I {}
   record B(int value) implements I {}
   ...
   private static final int[] INT_ARRAY = new Random(0).ints(1_000_000, 0, 100).toArray();
   private static final I[] OBJ_ARRAY = new Random(0).ints(1_000_000, 0, 100).mapToObj(i -> i < 50? new A(i): new B(i)).toArray(I[]::new);
   ...
   @Benchmark
   public int sum_int(int[] array) {
     var sum = 0;
     for(var i = 0; i < array.length; i++) {
       sum += array[i]; 
     }
     return sum;
   }
   
   @Benchmark
   public int sum_int(I[] array) {
     var sum = 0;
     for(var i = 0; i < array.length; i++) {
       sum += array[i].value(); 
     }
     return sum;
   }
   

Vous devez donc
  • Vous documenter un peu sur l'historique du runtime
  • Vous documenter sur les optimisations spécifiques autour des boucles et des appels de méthode
  • Vous documenter sur les optimisations générales de votre runtime
  • Trouver comment on fait pour benchmarker avec votre runtime
  • Trouver un moyen d'afficher le code assembleur correspondant à votre benchmark, par exemple avec Hotspot, il y a une option -XX:+PrintAsssembly et il faut installer un truc qui sait afficher le code, un desassembleur.
  • Expliquer les optimisations effectuées en s'appyant sur le code assembleur
  • Faire des beaux graphes expliquant la performance en fonction des optimisations (en les activant ou pas).
    Note: pour les moteurs JavaScript ne fait pas les tests dans le navigateur, car il fait plein d'autres choses en même temps !
  • Produire les slides correspondant
  • Discuter avec les autres groupes pour voir quelles sont les optimisations communes (Attention, une optimisation peut ne pas avoir le même nom suivant le runtime).

Runtime à étudier
  1. HotSpot (Kevin, Guillaume)
  2. OpenJ9 (Baticle, Nils)
  3. GraalVM Native Image(Vincent, Koffi)
  4. Chrome V8 (Axel, Soran)
  5. Edge ChakraCore (Salim, Nicolas)
  6. Nashorn (Traina, Marszal)
  7. Rhino (Melissa, Emilie)

Documentation