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

时间:2016-01-10 15:49:18

标签: java time timer nanotime

这是我提出的适度建议:

  1. JVM启动时
    1. 致电System.currentTimeMillis()并存储为“挂钟”时间:
      long currentTimeMillis0
    2. 致电System.nanoTime()并存储为“纳米”时间:long nanoTime0
  2. 在整个程序运行过程中,使用System.nanoTime()存储许多时间戳。
  3. 我很清楚nanoTime的确切价值本身是无用的,但在持续时间的上下文中使用时很有用:endNanoTime - beginNanoTime

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

2 个答案:

答案 0 :(得分:1)

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

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()

答案 1 :(得分:1)

在我使用毫秒和纳秒时间的情况下,我使用纳米时间来计算时间上的微小差异,并在开始时使用毫秒计时器来给出上下文。

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