2016-10-25 38 views
0

我读过的有关currentTimeMillis和nanoTime的一切似乎只关注精度。如果我只是以毫秒为单位寻找经过时间,那么我应该使用哪一个,如果我想获得最佳性能?用Java测量流逝时间的最快方法

似乎像currentTimeMillis将是答案,因为我不需要将ns的最终答案转换为ms,但是这是从我的应用程序的角度来看的,并且在引擎盖下面发生的事情可能会使它成为错误的选择,这就是我问的原因。

+0

我个人只是用#currentTimeMillis,你很少会需要纳秒的精度,以及上都可以发生的不准确之处是微不足道的,除非你是如此规模的工作已经(例如,如果你正在检查10秒,3 -5毫秒的不准确性不会杀了你,即使不准确可能会少得多)。尽管iirC#currentTimeMillis比较可以为负值,但是,除非您正在处理该比例(例如,以10毫秒为间隔进行计时),否则不太可能。 – Rogue

+0

nanoTime与currentTimeMillis一样准确(最差),如果不是更好的话 - 精确度的条款。至于哪个更快*你需要更清楚一点,以便我理解。 –

+0

NTP,用户,闰秒和其他来源会在某些情况下直接更改'currentTimeMillis'的值,使您的测量完全错误。如果你能忍受这一点,那就去吧。否则,使用nanoTime,这是一个严格单调的计数器,以及为什么你应该使用nanoTime来处理任何严重的应用程序。 – zapl

回答

2

纯Java中基本上只有两种选择;你已经将它们命名为:

  • System.currentTimeMillis
  • System.nanoTime

两种方法都JVM内部函数。
在Linux上,它们分别被编译为直接调用gettimeofdayclock_gettime
在Windows上 - 分别为GetSystemTimeAsFileTimeQueryPerformanceCounter

这些方法的性能在很大程度上取决于平台,CPU架构,操作系统版本,Java版本,并发线程数等。例如上在我的Windows笔记本电脑currentTimeMillis上需要7 ns,而nanoTime - 16 ns,而在多处理器Linux服务器上,这两种方法大约需要40 ns。所以,这取决于。

我强烈建议阅读阿列克谢Shipilёv的帖子Nanotrusting the nanotime覆盖Java的时间测量的许多方面。

2

您不应该使用currentTimeMillis,始终使用nanoTime来测量已用时间。实际上使用currentTimeMillis可能会产生负面结果。这是因为它使用系统时钟,该系统时钟被调整(有时会倒退)到您所在时区的时间。 nanoTime方法使用由JVM启动的时钟,该时钟正好用于计时。