Est-System.currentTimeMillis () la meilleure mesure de la performance de temps en Java?

StackOverflow https://stackoverflow.com/questions/1073325

  •  21-08-2019
  •  | 
  •  

Question

est System.currentTimeMillis () la meilleure mesure de la performance de temps en Java? Y a-t-il des années Gotcha lorsque vous utilisez ce pour comparer le temps avant d'agir au temps après l'action est prise? Y at-il une meilleure alternative?

Était-ce utile?

La solution

Je l'espère - c'est ce que je l'utilise quand je ne l'utilise nanoTime() .

Autres conseils

en plus System.nanoTime(), JMX est probablement la meilleure option viable:

java.lang.management.ManagementFactory.getThreadMXBean()

vous pouvez interroger l'heure cpu fil (mesurée en nanosecondes, mais pas avec précision nano secondes, comme pour System.nanoTime ())

Vous pouvez utiliser chronomètre de Google Goyave qui rend la mesure du temps super-facile.

Si vous avez besoin des mesures de temps monotones, System.nanoTime est un meilleur choix. System.currentTimeMillis est soumis à des variations UTC de synchronisation - secondes bissextiles, mises à jour NTP et la gigue, ainsi que les utilisateurs de réglage de l'horloge du système *. Cela peut causer des échecs spectaculaires dans certains types d'applications de synchronisation. System.nanoTime est censé être à l'abri de tout cela.

Les problèmes avec System.nanoTime incluent dépassement numérique périodique et imprécision temporelle à long terme, ce qui System.currentTimeMillis mieux pour des périodes de temps plus longues (à condition que les utilisateurs quittent l'horloge système seul). Notez que l'heure d'été et changement de fuseau horaire ne devrait pas affecter System.currentTimeMillis.

* Windows "Synchronisation avec le temps Internet" modifie pas à pas. Cela peut être très perturbateur, par opposition à une implémentation client appropriée NTP « pourchasse » le serveur en ajustant la fréquence de base de temps du client.

Avant Java 1.5 il n'y avait que System.currentTimeMillis. Cependant, la granularité de la valeur dépend du système d'exploitation sous-jacent et peut être grande. Sous Windows XP parfois je fini avec des écarts de 20ms. J'ai entendu Linux est beaucoup mieux avec des lacunes dans la gamme de 1-2ms.

Avec Java 1.5, vous pouvez également utiliser System.nanoTime. Je ne ai jamais eu des problèmes avec celui-ci.

Un Gotcha est que cette mesure en temps réel écoulé, pas le temps CPU - il est donc très dépendante de la charge du système. Ceci est très bien si votre sur une machine autrement libre, mais peut parfois produire des résultats intéressants si d'autres processus tentent de faire le travail.

Cet article a une solution intersting au problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top