Mesurer le temps de vos applications

Vous avez sans doute déjà mesuré le temps d’exécution de certaines de vos méthodes en utilisant la fonction System.currentTimeMillis() comme c’est d’ailleurs décrit dans la FAQ Java.
Je discutais hier avec un collègue de cette méthode et celui-ci m’a indiqué qu’il fallait se méfier de la granularité du résultat retourné et qu’il suffisait de faire un simple test.
Voici le code du test (ce code n’est pas propre, il en s’arrête pas, il faut interrompre l’exécution, mais le but est d’être concis…)


public class Test {    
   public static void main (String args[]){
        long start= System.currentTimeMillis();
        long time;
        for (;;){
            time= System.currentTimeMillis();
            System.out.println(time - start);
        }
    }
}

En fonction de la machine d’exécution, le pas varie. Sur mon poste, sur Windows, je vois plusieurs fois 0 puis plusieurs fois 16, puis 32…. Le pas moyen est 15 ou 16. Sous Linux, je ne rencontre pas ce problème et voit défiler presque toutes les valeurs (il y a des trous dans les valeurs selon ce que vous faites avec votre poste).
Ce n’est pas la peine d’ouvrir un bug, de nombreux existent déjà. Par contre ça peut être utile de mieux lire la javadoc car le problème est décrit.

Alors la prochaine fois que vous essayer de mesurer des performances, faites attention à cette granularité.

3 réflexions au sujet de « Mesurer le temps de vos applications »

  1. Personnellement, je ne suis toujours pas convaincu que comparer le temps système est la bonne façon de faire pour en mesurer sa performance.

    J’ai déjà eu des collègues qui voulaient me prouver que leur implémentation de code étaient meilleures qu’auparavant, car plus performante. Et ils essayaient de le prouver avec des méthodes de mesures comme ci-dessus.
    J’ai pu leur prouver que ce qu’ils disaient n’était pas vrai en leur montrant dans le bytecode généré qu’il y avait plus d’instructions à éxécuter dans leur implémentation que dans le codé précédent. Et que si leur implémentation semblaient aller plus vite, c’est uniquement parce que cela mesure le temps réels, et non pas le temps cpu. Il suffit qu’un mail arrive au moment de vos test, ou que l’antivirus se mette à tourner, ou encore que le garbage collector se mette en route à ce moment-là, pour que les résultats soient quelque peu faussés. Ce qu’il faudrait c’est avoir la possibilité de mesurer le temps CPU de l’application. Ce qui pourrait déjà donner une meilleure idée du temps pris en faisant abstraction de facteurs extérieurs à l’application java même.

Laisser un commentaire