首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用nanoTime()传递时间

用nanoTime()传递时间
EN

Stack Overflow用户
提问于 2016-01-31 07:50:36
回答 2查看 625关注 0票数 5

很长一段时间以来,我使用System.currentTimeMillis()测量传递时间,直到最近才发现我也可以使用nanoTime()。但是,有些结果与我所期望的不一样,因为nanoTime从任意的时间点来度量时间,而不是像currentTimeMillis那样用01-01-1970来度量时间。

来自nanoTime

返回最精确可用系统定时器的当前值(以纳秒为单位)。 这种方法只能用于测量经过的时间,而与系统或挂钟时间的任何其他概念无关。返回的值表示纳秒,因为某些固定但任意时间的(可能在将来,因此值可能为负值)。这种方法提供纳秒精度,但不一定是纳秒精度。没有保证价值观变化的频率。跨越大约292年(263纳秒)的连续调用中的差异将无法精确计算由于数值溢出而占用的时间。 例如,要度量某些代码执行所需的时间: long startTime = System.nanoTime();// .正在测量的代码..。long estimatedTime = System.nanoTime() - startTime;

我被武断的部分弄糊涂了。只有当两个调用的引用时间戳相同时,才能准确地测量传递的时间。然而,在API文档中,这并不能得到保证。我认为这就是我所提到的问题的原因。所使用的时间是实现细节,因此我不能依赖它。

我想知道,什么时候我可以很好地利用nanoTime,在什么情况下它会发生可怕的错误。出现在脑海中的主要用例是:

  • 比较不同线程的nanoTime时间戳
  • 比较来自同一个JVM的不同实例的nanoTime时间戳(例如,从以前的应用程序运行的序列化时间戳,或者作为消息的一部分传递给不同JVM)
  • 比较不同JVM实现中的nanoTime时间戳

这里有一些关于StackOverflow的文章,它们讨论了部分问题,但在很大程度上保留了选择时间的问题:

特别是链接在最后一篇文章中明确指出,当可以使用nanoTime时会有一些限制,但是如果不确切地知道这些限制,那么使用它本身就显得不安全,因为构建在它之上的功能可能会失败。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-31 10:16:40

文档也许应该明确地说明这一点,但是它们所指的“固定但任意”的意思是,在同一个JVM (即在同一个运行的JVM实例中)中,引用值是固定的。

因此,(1)是安全的,但不能超过这一点。

除此之外,任何事情都取决于实现的怪癖。

票数 1
EN

Stack Overflow用户

发布于 2016-01-31 10:19:56

共享CPU(普通计算机)上的定时永远不会精确。您不知道您的进程何时实际在CPU上运行(而不是其他100个进程中的一个)。它只能在运行的时候检查时间。

你测量的时间单位越小,这种不精确就越明显。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35111550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档