我读过的关于 currentTimeMillis 与 nanoTime 的所有内容似乎都只关注准确性。如果我只是在寻找以毫秒为单位的经过时间,如果我想要最好的性能,我应该使用哪一个?
似乎 currentTimeMillis 将是答案,因为我不需要将最终答案从 ns 转换为 ms,但这是从我的应用程序的角度来看,幕后发生的事情可能使它成为错误的选择,这就是为什么我我问。
我读过的关于 currentTimeMillis 与 nanoTime 的所有内容似乎都只关注准确性。如果我只是在寻找以毫秒为单位的经过时间,如果我想要最好的性能,我应该使用哪一个?
似乎 currentTimeMillis 将是答案,因为我不需要将最终答案从 ns 转换为 ms,但这是从我的应用程序的角度来看,幕后发生的事情可能使它成为错误的选择,这就是为什么我我问。
纯 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。所以,这取决于。
我强烈建议阅读 Alexey Shipilёv 的文章Nanotrusting the nanotime,其中涵盖了 Java 中时间测量的许多方面。
您不应该使用 currentTimeMillis,始终使用 nanoTime 来测量经过的时间。实际上使用 currentTimeMillis 可能会产生负面结果。这是因为它使用系统时钟,该时钟已调整(有时会倒退)到您所在时区的时间。nanoTime 方法使用由 JVM 启动的时钟,该时钟精确用于计时。