【问题标题】:Fastest way to measure elapsed time in Java [duplicate]在Java中测量经过时间的最快方法[重复]
【发布时间】:2017-03-08 02:26:19
【问题描述】:

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

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

【问题讨论】:

  • 我个人只使用#currentTimeMillis,你很少需要纳秒精度,除非你已经在那个规模上工作(例如,如果你正在检查10 秒,3 到 5 毫秒的误差不会杀死你,即使误差可能要小得多)。虽然 iirc #currentTimeMillis 比较可能会变为负数,但同样,除非你在那个规模上工作(例如,10 毫秒的时间间隔)
  • nanoTime 与 currentTimeMillis 一样准确(在最坏的情况下),如果不是更好的话——就精度而言。至于哪个更快,我的理解你需要更清楚一点。
  • NTP、用户、闰秒和其他来源会在某些情况下直接更改currentTimeMillis 的值,从而使您的测量完全错误。如果你能忍受,那就去吧。否则请使用 nanoTime,这是一个严格单调的计数器,这也是您应该将 nanoTime 用于任何严肃应用的原因。

标签: java performance date time elapsed


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在纯 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 中时间测量的许多方面。

    【讨论】:

    • 更新:在 Java 9 及更高版本中,我们可以调用Instant.now,分辨率为微秒。传统的计算机硬件时钟无法比这更精确地跟踪时间。
    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 2010-12-18
    • 2022-07-06
    • 1970-01-01
    • 2018-05-03
    • 2014-09-05
    相关资源
    最近更新 更多