当前位置: 首页 > 面试题库 >

System.currentTimeMillis和System.nanoTime

狄富
2023-03-14
问题内容

Accuracy Vs. Precision

我想知道的是在更新对象在游戏中的位置时应该使用System.currentTimeMillis()还是System.nanoTime()?他们的运动变化与自上次通话以来经过的时间成正比,我想尽可能地精确。

我已经读到不同操作系统之间存在一些严重的时间分辨率问题(即Mac / Linux的分辨率几乎为1毫秒,而Windows的分辨率为50毫秒?)。我主要是在Windows上运行我的应用,而50ms的分辨率似乎非常不准确。

是否有比我列出的两个更好的选择?

有什么建议/意见吗?


问题答案:

如果你只是在寻找经过时间的极其精确的度量,请使用System.nanoTime()System.currentTimeMillis()会为你提供自该纪元以来最精确的经过时间(以毫秒为单位),但System.nanoTime()相对于任意点,你可以得到十亿分之一秒的精确时间。

从Java文档中:

public static long nanoTime()

返回最精确的可用系统计时器的当前值,以纳秒为单位。

此方法只能用于测量经过时间,并且与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意的起始时间以来的纳秒(也许是将来的时间,因此值可能为负)。此方法提供纳秒精度,但不一定提供纳秒精度。无法保证值的更改频率。 由于数值上溢,跨越大约292年(2 63纳秒)的连续呼叫中的差异将无法准确计算经过的时间。

例如,要测量某些代码执行所需的时间:

long startTime = System.nanoTime();    
// ... the code being measured ...    
long estimatedTime = System.nanoTime() - startTime;


 类似资料:
  • 我正在使用TestNG编写单元测试。问题是当我模拟System.CurrentTimeMillis时,它返回的是实际值,而不是模拟的值。理想情况下,它应该返回0L,但它返回的是实际值。我该怎么做才能继续?

  • 问题内容: 我想以毫秒为单位获取当前UTC时间。我搜索了google,并得到了一些System.currentTimeMillis()确实返回UTC时间的答案。但事实并非如此。如果我执行以下操作: 这三个时间几乎都相同(由于通话,相差以毫秒为单位)。 这不是UTC时间,而是我的时区时间。如何在Android中获取当前UTC时间? 问题答案: 您显示的所有三行都将给出自unix纪元以来的毫秒数,这是

  • 问题内容: 您能否说明一下如何为默认系统时区和给定时区获取正确的纪元时间(以毫秒为单位)。 给定 1.时区:GMT + 3 2.以下代码段: 3.输出: 4. System.currentTimeMillis()的 JavaDoc,它指示返回值将是 当前时间与UTC 1970年1月1日午夜之间的差(以毫秒为单位)。 所以为什么 at 的输出与of的输出相同,尽管提及的文档? at 的输出与有所不同

  • 问题内容: 根据java.lang.System API currentTimeMillis()返回当前时间(以毫秒为单位) nanoTime()返回正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位。 严格来说,纳秒为1e-9,毫秒为1e-3。因此,以纳秒为单位的持续时间必须是以毫秒为单位的相同持续时间的1e6的倍数。实际上不是这种情况,这是什么原因? 问题答案: 有一个任意的起点;

  • 问题内容: 我有一个简单的Java程序,我想知道某些操作之间的时间差。对于这个问题,细节并不重要,但是让我们采取以下情形。 当代码在计算机上运行时,差异有多可靠? 让我们说,处理器开始从我的代码执行一些指令,然后为另一个进程提供上下文,该进程执行一段时间,然后返回执行与该Java进程相关的指令。 因此,时间差应取决于计算机的当前状态,即正在运行多少个进程等?因此,在分析过程中,某些操作需要运行,这

  • 问题内容: 看来不是很准确。 看到这个例子: 结果是(在Windows XP上): 为什么不是呢?以及如何获得当前时间的精确毫秒数? 问题答案: 这是完全可以预期的。您会在.NET上使用看到相同的东西。(有关该主题的面向.NET的观点,请参阅Eric Lippert的博客文章。) 您可以使用来获得更精确的计时器 ,仅用于测量 -这并不意味着要给出 绝对的 时间,而只是用于测量 间隔 。 我不知道从