Benchmarking et optimisations en Java
Préliminaires à l'exécution du benchmark
Récupération de ressources
La JVM récupère automatiquement des ressources de deux manières : le "Garbage Collection" et "L'Object finalization".La classe System offre à cet effet deux méthodes pour effectuer manuellement cette opération : gc() et runFinalization() que l'on peut par exemple placer dans une méthode cleanJvm().
Le temps imparti à cette opération doit être inclus dans le temps d'exécution de la tâche, mais nécessite d'isoler le GC/OF provoqué par du code externe.
La méthodologie à suivre est donc la suivante :
- Avant toute mesure, appeler cleanJVM().
- Mesurer le temps de 60 exécutions d'une seconde chacune environ (multiples invocations de la tâche).
- Lancer cleanJVM() mais mesurer cette fois le temps de son exécution : si celui-ci est égal à 1% ou plus du temps d'exécution de la tâche, un avertissement doit être adressé au développeur, car il semblerait que le temps nécessaire pour le GC/OF lié à la tâche n'a pas été totalement inclus dans la mesure précédente.
A propos des caches
Les caches hardware et de l'OS compliquent les benchmark :- Cache du système de fichiers : il ne faut pas prendre toujours le même fichier lors de tests d'entrée-sortie.
- Cache CPU : il faut faire varier la taille des données utilisée par une tâche avant de tirer des conclusions hâtives. C'est d'autant plus vrai lorsque nous comparons les performances d'un code en C et en Java par exemple.
Précautions d'usage
Voici quelques précautions d'usage à respecter avant l'exécution d'un benchmark :- Bannir l'utilisation d'un portable Acer (expérience personnelle ;-) )
- Configurer la gestion de l'énergie au niveau de l'OS
- Désactiver les mises en veille disque dur, etc...
- Désactiver le Intel SpeedStep
- Stopper l'exécution des autres programmes en tâches de fond
- Sous Windows, Rundll32.exe advapi32.dll,ProcessIdleTasks, mais cela prend du temps, énormément de temps...
- Jouer avec les options de la JVM (-server obligatoire, -enableassertions, etc...)