在 Java 中测量经过时间的最快方法

Bre*_*212 0 java performance time date elapsed

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

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

apa*_*gin 5

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

  • System.currentTimeMillis
  • System.nanoTime

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

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

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


Mat*_*teo 5

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