02 février 2008

commons-monitoring - 2ème


A quoi sert System.nanoTime() en Java ? Qui a VRAIMENT besoin d'une précision en nanosecondes ?

Premier élément de réponse, System.nanoTime() ne fournit pas un compteur en ns, mais le meilleur compteur disponible sur le système. La précision réellement obtenue est donc ... indéterminée.

C'est d'ailleurs également le cas de System.currentTimeMillis(), qui sous Windows repose sur un compteurs standard de l'OS, ce qui permet à cette méthode d'être extrèmement rapide ... au prix d'une imprécision de 10 à 15ms ! Ennuyeux pour évaluer le temps de traitement des méthodes Java, qui sont régulièrement de l'ordre de quelques ms...

Sur le même Windows, System.nanoTime() est environ 100x plus lent, mais fournit une précisionde l'ordre de la microseconde (selon le hardware, la version Windows, le service pack et la conf système !) .

En résumé, System.nanoTime() fournit ce qu'il y a de plus précis sur le système hôte, et System.currentTimeMillis() un timestamp qui peut parfois être imprécis de 15ms.

"Write once, run anywhere" qu'ils disaient ! Si vous cherchez un compteur en secondes ça devrait aller. Pour faire plus fin, ... ça dépend. Donc dans le doute, on prend les nanosecondes et on ajoute un joli warning dans la doc :

"la précision des mesures peut varier de 1 à 10.000.000"