测量Java中所用时间的最快方法

时间:2016-10-25 21:34:41

标签: java performance date time elapsed

我读到的关于currentTimeMillis和nanoTime的所有内容似乎只关注准确性。如果我只是以毫秒为单位寻找经过的时间,如果我想获得最佳性能,我应该使用哪一个?

看起来像currentTimeMillis就是答案,因为我不需要将最终答案从ns转换为ms,但这是从我的应用程序的角度来看,并且引擎盖下的内容可能会使它成为错误的选择,这是为什么我要问。

2 个答案:

答案 0 :(得分:4)

纯Java中基本上只有两个选项;你已经命名了它们:

  • System.currentTimeMillis
  • System.nanoTime

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

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

我强烈建议阅读AlexeyShipilёv的帖子Nanotrusting the nanotime,其中涵盖了Java中时间测量的许多方面。

答案 1 :(得分:3)

你不应该使用currentTimeMillis,总是使用nanoTime来测量经过的时间。实际上使用currentTimeMillis会产生负面结果。这是因为它使用系统时钟,系统时钟经过调整(有时会向后移动)到您所在时区的时间。 nanoTime方法使用由JVM启动的时钟,该时钟精确地用于计时。