0

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

似乎 currentTimeMillis 将是答案,因为我不需要将最终答案从 ns 转换为 ms,但这是从我的应用程序的角度来看,幕后发生的事情可能使它成为错误的选择,这就是为什么我我问。

4

2 回答 2

5

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

  • System.currentTimeMillis
  • System.nanoTime

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

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

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

于 2016-10-25T22:11:36.813 回答
4

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

于 2016-10-25T22:17:50.043 回答