如何比较两个纳米时间值?[javadoc confusion]

2022-09-02 13:28:03

我已经阅读了javadoc,一切似乎都很清楚。直到我到达最后一段:System.nanoTime()

比较两个 nanoTime 值

long t0 = System.nanoTime();

...

long t1 = System.nanoTime();

应该使用t1 - t0<0,而不是t1<t0,因为数字溢出的可能性。

有两件事我不清楚:

  1. 为什么要检查是否在之后拍摄?我的理解是,纳米时间总是在增加。所以,我宁愿检查.t1 < t0t1t0t1 > t0
  2. 让我们假设这是一个拼写错误,他们的意思是正确的检查是。我仍然不明白为什么这是正确的检查方式,而不是。他们提到数字溢出,我不太明白他们的意思。关于数字溢出,下面是提到的:t1 - t0 > 0t1 > t0

由于数值溢出,跨度大于大约 292 年(2^63 纳秒)的连续调用的差异将无法正确计算经过的时间。

好吧,既然纳米时间是作为长值存储的,那么它最终会在292年后溢出。接下来会发生什么?它是否从头开始,即最低的负值 -2^63?还是它停止测量并始终返回(2 ^ 63 - 1)?


答案 1

你是对的,你引用的文档部分似乎有点混乱。

但是,文档中最重要的部分是:

此方法只能用于测量经过的时间,与任何其他系统或挂钟时间概念无关。返回的值表示自某个固定但任意的原点时间(可能是将来,因此值可能为负)以来的纳秒数。在 Java 虚拟机实例中,此方法的所有调用都使用相同的源;其他虚拟机实例可能使用不同的源。

(着重号是我加的。

这意味着您不能保证您的代码不会碰巧在生成的长头值碰巧从正数变为负值时运行。

没有什么能保证这将在300年后发生,它可能会在今天发生。

目前,我的JVM返回一些数字,如3496793269188,但是如果它愿意,它可能会返回一些非常接近9223372036854775807的数字,(即,),这将使从正到负的翻转迫在眉睫。Long.MAX_VALUE

因此,您应该采取一切必要的预防措施。


答案 2

好吧,说实话。考虑这样的例子:javadoc

        long t0 = Long.MAX_VALUE;
        long t1 = Long.MIN_VALUE;

        System.out.println(t1 < t0);
        System.out.println(t1 - t0 < 0);

它会给

true
false

而在数学上,两个表达式都是正确的。但在我们的例子中,我们知道,负值意味着它被溢出,因此它应该大于正数。time


推荐