Un de mes amis m'a montré quelque chose qu'il avait fait, et j'étais sérieusement découragé d'expliquer comment cela aurait pu arriver: il utilisait un System.nanotime pour chronométrer quelque chose, et il donnait à l'utilisateur une mise à jour toutes les secondes combien de temps s'est écoulé (Thread.sleep (1000) pour cette partie), et il a fallu apparemment pour toujours (quelque chose qui attendait 10 secondes a pris environ 3 minutes pour finir). Nous avons essayé d'utiliser millitime afin de voir combien de temps s'était écoulé: il imprimait combien de nanotime s'était écoulé chaque seconde, et nous avons vu que chaque seconde, le nanotime se déplaçait de 40 à 50 millisecondes par seconde.System.nanotime est-il lent?
J'ai vérifié les bogues liés à System.nanotime et Java, mais il semblait que les seules choses que je pouvais trouver impliqué le nanotime soudainement greatly increasing and then stopping. J'ai également parcouru this blog entry basé sur quelque chose que j'ai lu dans une question différente, mais cela n'avait rien qui pourrait le causer.
De toute évidence, cela pourrait être travaillé pour cette situation en utilisant simplement le millénaire à la place; Il y a beaucoup de solutions de contournement à cela, mais ce qui m'intéresse, c'est s'il y a autre chose qu'un problème matériel avec l'horloge système ou du moins l'horloge la plus précise du CPU (puisque c'est ce que System.nanotime semble utiliser) qui pourrait le faire fonctionner régulièrement lent comme ça?
long initialNano = System.nanoTime();
long initialMili = System.currentTimeMillis();
//Obviously the code isn't actually doing a while(true),
//but it illustrates the point
while(true) {
Thread.sleep(1000);
long currentNano = System.nanoTime();
long currentMili = System.currentTimeMillis();
double secondsNano = ((double) (currentNano - initialNano))/1000000000D;
double secondsMili = ((double) (currentMili - initialMili))/1000D;
System.out.println(secondsNano);
System.out.println(secondsMili);
}
secondsNano imprime quelque chose le long des lignes de 0,04, alors que secondsMili imprime quelque chose de très proche de 1.
Il ressemble à un bug le long de cette ligne a été rapporté à Sun's bug database, mais ils ont fermé comme un doublon, mais leur lien ne va pas à un bug existant. Il semble être très spécifique au système, donc je suis de plus en plus sûr que c'est un problème matériel.
Pouvez-vous fournir plus d'informations sur votre environnement: système d'exploitation, matériel, version Java? Je viens de lancer votre échantillon sur ma machine et cela produit des résultats attendus (incrément de nano et mili seconde chaque seconde de 1, plus ou moins). Mon environnement: Windows XP, Dell Optiplex, Sun JDK 1.6.0_14 –
Pas ma machine, donc je vais donner ce que je peux: Windows XP SP3, Core Duo, JDK 1.6. Je suppose que c'est probablement un problème matériel avec tout ce que java utilise pour synchroniser le nanoTime, mais j'essaie de voir s'il y a quelque chose d'autre qui pourrait le provoquer. – DivineWolfwood
J'ai essayé votre code (sur Win XP, Core 2 Duo, Sun Java 1.6.0_16) mais je ne peux pas reproduire le problème. Les temps nano/milli se situent à 0,001 s les uns des autres sur mon système. – Jesper