64 votes

Pourquoi est-ce Système.nanoTime() de façon plus lente (de performance) que le Système.currentTimeMillis()?

Aujourd'hui j'ai fait un peu rapide Benchmark pour tester les performances de vitesse de System.nanoTime() et System.currentTimeMillis():

long startTime = System.nanoTime();

for(int i = 0; i < 1000000; i++) {
  long test = System.nanoTime();
}

long endTime = System.nanoTime();

System.out.println("Total time: "+(endTime-startTime));

Ce sont les résultats:

System.currentTimeMillis(): average of 12.7836022 / function call
System.nanoTime():          average of 34.6395674 / function call

Pourquoi les différences dans la vitesse de course si grand?

Système de référence:

Java 1.7.0_25
Windows 8 64-bit
CPU: AMD FX-6100

68voto

Rohit Jain Points 90368

À partir de cet Oracle blog:

System.currentTimeMillis() est mis en œuvre à l'aide de la GetSystemTimeAsFileTime méthode, qui se contente de lire le bas le temps de résolution de la valeur du jour que Windows conserve. La lecture de ce une variable globale est naturellement très rapide autour de 6 cycles selon l'information publiée.

System.nanoTime() est mis en œuvre à l'aide de la QueryPerformanceCounter/ QueryPerformanceFrequency API (si disponible, sinon, il retourne currentTimeMillis\*10\^6). QueryPerformanceCounter(QPC) est mis en œuvre de différentes façons selon le matériel, il est en cours d'exécution sur. Typiquement, il va utiliser le programmable interval timer (PIT), ou l'alimentation ACPI gestion de la minuterie (PMT), ou au niveau de la CPU timestamp-compteur (TSC). Accès à la FOSSE/PMT exige l'exécution de la lenteur de port d'e/S instructions et comme un résultat, le temps d'exécution pour la QPC est de l'ordre de microsecondes. En revanche la lecture de la TSC est de l'ordre de 100 horloge cycles (lire la TSC de la puce et de la convertir en une valeur de temps basé sur la fréquence de fonctionnement).

Peut-être cette réponse à la question. Les deux méthodes utilisent différents nombre de cycles d'horloge, ce qui résulte en vitesse lente de la, plus tard.

Plus loin dans ce blog dans la section conclusion:

Si vous êtes intéressé à mesurer/calculer le temps écoulé, puis utilisez toujours le Système.nanoTime(). Sur la plupart des systèmes, il donnera une résolution de l'ordre de quelques microsecondes. Sachez cependant, cet appel peut également prendre microsecondes à exécuter sur certaines plates-formes.

24voto

Eelke Points 7687

La plupart des OS (vous n'avez pas mentionné ce que vous utilisez) ont un compteur de mémoire/horloge qui fournit une précision à la milliseconde (ou proche). Pour l'ordre de la nanoseconde précision plus avoir à lire un matériel de comptoir. La communication avec le matériel est beaucoup plus lente que la lecture de la valeur déjà en mémoire.

5voto

Michael Borgwardt Points 181658

Il ne peut être le cas sur Windows. Voir cette réponse à une question similaire.

Fondamentalement, System.currentTimeMillis() lit juste une variable globale gérée par Windows (qui est ce qu'il a une faible granularité), alors que l' System.nanoTime() a réellement à faire des opérations d'e / s.

1voto

Walt Corey Points 6

Vous êtes en mesure de que sur Windows, ne sont pas vous. Je suis allé à travers cet exercice, en 2008. nanoTime EST plus lent sur Windows que currentTimeMillis. Je me souviens que sur Linux, nanotime est plus rapide que currentTimeMillis et est certainement plus rapide que sur Windows.

La chose importante à noter est que si vous essayez de mesurer l'agrégation de plusieurs sous-ordre de la milliseconde opérations, vous devez utiliser nanotime comme si l'opération terminé en moins de 1/1000e de seconde votre code, en comparant currentTimeMillis montrera que l'opération est instantanée 1000 de celles-ci seront toujours instantanée. Ce que vous voulez faire est d'utiliser nanotime ensuite le tour de la milliseconde la plus proche, de sorte que si une opération a eu 8000 nanosecondes, il sera compté comme 1 milliseconde, pas 0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X