Cette réponse a été écrite en 2011 du point de vue de ce que faisait réellement le JDK de Sun de l'époque fonctionnant sur les systèmes d'exploitation de l'époque. C'était il y a bien longtemps ! La réponse de Leventov offre une perspective plus actuelle.
Ce post est faux, et nanoTime
est sûr. Il y a un commentaire sur le post qui renvoie à un billet de blog par David Holmes un spécialiste du temps réel et de la concurrence chez Sun. C'est écrit :
System.nanoTime() est mis en œuvre à l'aide de l'API QueryPerformanceCounter/QueryPerformanceFrequency [...] Le mécanisme par défaut utilisé par QPC est déterminé par la couche d'abstraction matérielle (HAL) [...] Cette valeur par défaut change non seulement en fonction du matériel mais aussi des versions du système d'exploitation. Par exemple, le Service Pack 2 de Windows XP a changé les choses pour utiliser la minuterie de gestion de l'énergie (PMTimer) plutôt que le compteur d'horodatage du processeur (TSC) en raison de problèmes de non synchronisation du TSC sur différents processeurs dans les systèmes SMP, et du fait que sa fréquence peut varier (et donc sa relation avec le temps écoulé) en fonction des paramètres de gestion de l'énergie.
Donc, sous Windows, cette était un problème jusqu'à WinXP SP2, mais ce n'est plus le cas maintenant.
Je ne trouve pas de partie II (ou plus) qui parle d'autres plates-formes, mais cet article inclut une remarque selon laquelle Linux a rencontré et résolu le même problème de la même manière, avec un lien vers la page FAQ pour clock_gettime(CLOCK_REALTIME) qui dit :
- Est-ce que clock_gettime(CLOCK_REALTIME) est cohérent sur tous les processeurs/cores ? (Est-ce que l'architecture a de l'importance ? par exemple ppc, arm, x86, amd64, sparc).
Es debe ou il est considéré comme bogué.
Cependant, sur x86/x86_64, il est possible de voir des TSC non synchronisés ou à fréquence variable provoquer des incohérences temporelles. Les noyaux 2.4 n'avaient pas vraiment de protection contre cela, et les premiers noyaux 2.6 n'étaient pas non plus très performants dans ce domaine. À partir de la version 2.6.18, la logique de détection de ce problème est meilleure et nous nous rabattons généralement sur une source d'horloge sûre.
ppc a toujours une base de temps synchronisée, donc cela ne devrait pas être un problème.
Donc, si le lien de Holmes peut être lu comme impliquant que nanoTime
appelle clock_gettime(CLOCK_REALTIME)
alors il est sûr à partir du noyau 2.6.18 sur x86, et toujours sur PowerPC (parce qu'IBM et Motorola, contrairement à Intel, savent réellement comment concevoir des microprocesseurs).
Il n'y a aucune mention de SPARC ou de Solaris, malheureusement. Et bien sûr, nous n'avons aucune idée de ce que font les JVM d'IBM. Mais les JVM de Sun sur les Windows et Linux modernes font ça bien.
EDIT : Cette réponse est basée sur les sources qu'elle cite. Mais je crains toujours qu'elle ne soit complètement fausse. Des informations plus récentes seraient très utiles. Je viens de tomber sur un lien vers un un article plus récent de quatre ans sur les horloges de Linux ce qui pourrait être utile.
2 votes
Je n'ai pas de réponse mais je suis d'accord avec vous. Peut-être que cela devrait être considéré comme un bug dans la JVM.
2 votes
Ce post est incorrect et ne pas utiliser TSC est lent mais vous devez vivre avec : bugs.sun.com/bugdatabase/view_bug.do?bug_id=6440250 TSC peut également être rendu utile par le biais d'un hyperviseur, mais il est alors à nouveau lent.
1 votes
Et bien sûr, vous pouvez fonctionner dans une machine virtuelle où un processeur peut apparaître au milieu d'une session :D