System.currentTimeMillis() 与 System.nanoTime() 结合使用是否合理?
Is it reasonable to use System.currentTimeMillis() in conjunction with System.nanoTime()?
这是我的小建议:
- JVM 启动时
- 调用
System.currentTimeMillis()
并存储为起始"wall clock"时间:
long currentTimeMillis0
.
- 调用
System.nanoTime()
并存储为起始"nano"时间:
long nanoTime0
.
- 在程序的整个运行中,使用
System.nanoTime()
存储了许多时间戳。
我很清楚 nanoTime 的确切值本身是无用的,但在持续时间的上下文中使用时很有用:endNanoTime - beginNanoTime
。
然后,在记录的任何 nanoTime 中,计算 "currentTimeNanos" 是否合理:
(1000L * currentTimeMillis0) + (anyNanoTime - nanoTime0)
?
我认为您需要合并 start/end 次,以毫秒和纳秒为单位。例如:
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()
我使用 milli-second 和 nano-time 的地方是我使用 nano-time 来计算时间上的微小差异,并在开始时使用 milli-second 计时器来提供上下文。
注意:如果您有连续的计时流,则可以在机器之间使用 nano-time。即你可以估计它们之间的最佳时间并检测异常值(即使你不知道绝对差异)我用这个 class 来帮助估计 RunningMinimum
这是我的小建议:
- JVM 启动时
- 调用
System.currentTimeMillis()
并存储为起始"wall clock"时间:long currentTimeMillis0
. - 调用
System.nanoTime()
并存储为起始"nano"时间:long nanoTime0
.
- 调用
- 在程序的整个运行中,使用
System.nanoTime()
存储了许多时间戳。
我很清楚 nanoTime 的确切值本身是无用的,但在持续时间的上下文中使用时很有用:endNanoTime - beginNanoTime
。
然后,在记录的任何 nanoTime 中,计算 "currentTimeNanos" 是否合理:
(1000L * currentTimeMillis0) + (anyNanoTime - nanoTime0)
?
我认为您需要合并 start/end 次,以毫秒和纳秒为单位。例如:
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()
我使用 milli-second 和 nano-time 的地方是我使用 nano-time 来计算时间上的微小差异,并在开始时使用 milli-second 计时器来提供上下文。
注意:如果您有连续的计时流,则可以在机器之间使用 nano-time。即你可以估计它们之间的最佳时间并检测异常值(即使你不知道绝对差异)我用这个 class 来帮助估计 RunningMinimum