gpt4 book ai didi

java - 如何比较两个纳米时间值? [javadoc 困惑]

转载 作者:IT老高 更新时间:2023-10-28 20:53:34 26 4
gpt4 key购买 nike

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

To compare two nanoTime values

long t0 = System.nanoTime();

...

long t1 = System.nanoTime();

one should use t1 - t0 < 0, not t1 < t0, because of the possibility of numerical overflow.

有两点我不清楚:

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

Differences in successive calls that span greater than approximately 292 years (2^63 nanoseconds) will not correctly compute elapsed time due to numerical overflow.

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

最佳答案

您是对的,您引用的文档部分似乎有些困惑。

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

This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time. The value returned represents nanoseconds since some fixed but arbitrary origin time (perhaps in the future, so values may be negative). The same origin is used by all invocations of this method in an instance of a Java virtual machine; other virtual machine instances are likely to use a different origin.

(重点由我添加。)

这意味着您无法保证您的代码不会在产生的 long 值碰巧从正值变为负值时运行。

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

目前,我的 JVM 返回一些数字,例如 3496793269188,但如果它愿意,它可以返回一些非常接近 9223372036854775807 的数字(即 Long.MAX_VALUE),这将产生即将由正转负。

所以,你应该采取一切必要的预防措施。

关于java - 如何比较两个纳米时间值? [javadoc 困惑],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33996599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com