我读到的关于currentTimeMillis和nanoTime的所有内容似乎只关注准确性。如果我只是以毫秒为单位寻找经过的时间,如果我想获得最佳性能,我应该使用哪一个?
看起来像currentTimeMillis就是答案,因为我不需要将最终答案从ns转换为ms,但这是从我的应用程序的角度来看,并且引擎盖下的内容可能会使它成为错误的选择,这是为什么我要问。
答案 0 :(得分:4)
纯Java中基本上只有两个选项;你已经命名了它们:
System.currentTimeMillis
System.nanoTime
这两种方法都是JVM内在函数
在Linux上,它们被编译为分别直接调用gettimeofday
或clock_gettime
在Windows上 - 分别为GetSystemTimeAsFileTime
或QueryPerformanceCounter
。
这些方法的性能很大程度上取决于平台,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启动的时钟,该时钟精确地用于计时。