将 System.currentTimeMillis() 与 System.nanoTime() 结合使用是不是合理?

Posted

技术标签:

【中文标题】将 System.currentTimeMillis() 与 System.nanoTime() 结合使用是不是合理?【英文标题】:Is it reasonable to use System.currentTimeMillis() in conjunction with System.nanoTime()?将 System.currentTimeMillis() 与 System.nanoTime() 结合使用是否合理? 【发布时间】:2016-01-10 15:49:17 【问题描述】:

这是我的谦虚建议:

    JVM 启动时
      致电System.currentTimeMillis() 并将其存储为开始“挂钟”时间:long currentTimeMillis0。 致电System.nanoTime() 并存储为开始“纳米”时间:long nanoTime0
    在程序运行期间,使用System.nanoTime() 存储许多时间戳

我很清楚 nanoTime 的确切值本身没有用,但在持续时间的上下文中使用时很有用:endNanoTime - beginNanoTime

那么,在任何记录的 nanoTime 中,将“currentTimeNanos”计算为: (1000L * currentTimeMillis0) + (anyNanoTime - nanoTime0)?

【问题讨论】:

是的...在单个 JVM 实例中这已经足够了。 【参考方案1】:

我使用毫秒和纳米时间的地方是我使用纳米时间来计算时间上的微小差异,并在开始时使用毫秒计时器来提供上下文。

注意:如果您有连续的计时流,则可以在机器之间使用纳米时间。即您可以估计它们之间的最佳时间并检测异常值(即使您不知道绝对差异)我使用这个类来帮助估计RunningMinimum

【讨论】:

【参考方案2】:

我认为您需要结合开始/结束时间,以毫秒和纳米为单位。例如:

long startTimeMillis = System.currentTimeMillis() * 1000;
long startTimeNano = System.nanoTime();
... // do some work
long currentTimeNano = (System.currentTimeMillis()*1000 - startTimeMillis) + (System.nanoTime() - startTimeNano);

更多信息,nanoTime方法的官方javadoc: https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime()

【讨论】:

计算纳时差加上0.1%似乎是一种复杂的方法,但有轻微误差。你能解释一下这比单独的纳米时间更好吗? 毫和纳米之间的比例是 1000000 而不是 1000。但是在 Java 中,无论如何你都不能对亚毫瞬间(而不是持续时间)做任何有用的事情。

以上是关于将 System.currentTimeMillis() 与 System.nanoTime() 结合使用是不是合理?的主要内容,如果未能解决你的问题,请参考以下文章

学习记录

使用Guava RateLimiter限流

时间日期类

java中获取日期和时间的方法总结

Java学习笔记22(Date类DateFormat类)

将自己的博客园,打造成个人知乎