Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

nanoTime vs. currentTimeMillis

1 réponse
Avatar
Alexandre Vaissière
Hello,

J'ai l'impression que System.currentTimeMillis souffre de défauts pour
calculer un delta entre deux instants:
* mauvaise précision, de l'ordre de 10ms sur windows
* peut aller backwards en cas de NTP
Ai-je bon ?

J'aimerai savoir si System.nanoTime est plus fiable, par fiable
j'entends que System.nanoTime:
* ne puisse jamais aller backwards
* ni sauter vers une valeur aléatoire au cours de la vie d'un process,
* ait une précision de l'ordre de la ms (ou moins)

En d'autres termes, je voudrais une réponse définitive à:

si a l'instant T je fais start = System.nanoTime
si a l'instant T+x je fais stop = System.nanoTime
alors stop - start est-il toujours égal à x (+ ou - la précision) ?

D'après la javadoc, il semble que ce soit le cas. Toutefois les
résultats de recherche sur google sont plus mitigés, et se
rapprocheraient plutôt de

"Yes but not on windows < XP XP2 and linux < 2.6.18 and if underlying
platform supports a monotonic clock."

(par exemple ici
http://stackoverflow.com/questions/510462/is-system-nanotime-completely-useless)

Il semble toutefois que System.nanoTime ne marche pas comme attendu sur
XP64 sp2
http://stackoverflow.com/questions/7270314/scheduledthreadpool-scheduleatfixedrate-strange-behaviour

Est-ce qu'un quelqu'un a une réponse totalement précise qui donnerait
les versions de JVM, et d'os (et de processeur ?) pour avoir un
System.nanoTime correct ?

Merci par avance,
Alexandre.

1 réponse

Avatar
Yliur
Le Wed, 26 Oct 2011 11:08:41 +0200
Alexandre Vaissière a écrit :

Bonjour

J'ai l'impression que System.currentTimeMillis souffre de défauts
pour calculer un delta entre deux instants:
* mauvaise précision, de l'ordre de 10ms sur windows



C'est écrit dans la javadoc, et ça va effectivement dépendre du système.

* peut aller backwards en cas de NTP



Probablement, puisque ça renvoie une date depuis le 1er janvier 1970.


J'aimerai savoir si System.nanoTime est plus fiable, par fiable
j'entends que System.nanoTime:
* ne puisse jamais aller backwards
* ni sauter vers une valeur aléatoire au cours de la vie d'un
process,



C'est ce que je comprends de la Javadoc.

* ait une précision de l'ordre de la ms (ou moins)



Ça ne me semble pas garanti, parce que ça dépend du matériel et du
système (il faut qu'ils fournissent une information aussi précise).


En d'autres termes, je voudrais une réponse définitive à:

si a l'instant T je fais start = System.nanoTime
si a l'instant T+x je fais stop = System.nanoTime
alors stop - start est-il toujours égal à x (+ ou - la précision) ?

D'après la javadoc, il semble que ce soit le cas. Toutefois les
résultats de recherche sur google sont plus mitigés, et se
rapprocheraient plutôt de

"Yes but not on windows < XP XP2 and linux < 2.6.18 and if underlying
platform supports a monotonic clock."

(par exemple ici
http://stackoverflow.com/questions/510462/is-system-nanotime-completely-useless)

Il semble toutefois que System.nanoTime ne marche pas comme attendu
sur XP64 sp2
http://stackoverflow.com/questions/7270314/scheduledthreadpool-scheduleatfixedrate-strange-behaviour

Est-ce qu'un quelqu'un a une réponse totalement précise qui donnerait
les versions de JVM, et d'os (et de processeur ?) pour avoir un
System.nanoTime correct ?



Je n'ai pas de réponse définitive ou totalement précise.

Mais quelques questions/remarques :
- Si c'est pour écrire un programme totalement portable, ça me paraît
compromis.
- Si c'est pour choisir une plate-forme pour une appli, est-ce qu'il
n'y a pas moyen d'écrire un test ? Au moins pour la précision, tu
peux regarder combien de valeurs différentes tu obtiens. Pour les
questions de multicoeurs c'est plus compliqué, mais les tests
fournis dans ton deuxième lien fournissent une première base.