【发布时间】:2016-03-03 23:17:43
【问题描述】:
我已经阅读了System.nanoTime() 的 javadoc,一切似乎都很清楚。直到我到达最后一段:
比较两个 nanoTime 值
long t0 = System.nanoTime();
...
long t1 = System.nanoTime();应该使用 t1 - t0
有两点我不清楚:
- 如果
t1在t0之后被占用,为什么还要检查t1 < t0?我的理解是纳米时间总是在增加。所以,我宁愿检查t1 > t0。 - 假设这是一个错字,他们的意思是正确的检查是
t1 - t0 > 0。我仍然不明白为什么这是正确的检查方式而不是t1 > t0。他们提到了数字溢出,我不太明白他们的意思。关于数值溢出,这里有提到:
由于数值溢出,超过大约 292 年(2^63 纳秒)的连续调用的差异将无法正确计算经过的时间。
好的,所以由于纳米时间是作为长值存储的,所以最终会在 292 年之后溢出。接下来会发生什么?它是否从头开始,即最低的负值-2 ^ 63?还是它总是停止测量并返回 (2^63 - 1)?
【问题讨论】:
-
数值溢出总是一样的。例如
Integer.MAX_VALUE + 1 = Integer.MIN_VALUE. -
这也只是一种解决方法...... 584 年后,即使
t1-t0<0也不再适用;) -
@ferrybig,这不是真的。正如 Javadoc 所指出的,纳米时间使用与系统时间无关的固定原始时间,并且在 JVM 终止之前不会改变。随系统时钟变化的是 System.currentTimeMillis() 。仅当此处的大多数答案中已解释的数字溢出时,纳米时间才会返回“较早”的时间。
标签: java time comparison integer-overflow