首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >System.currentTimeMillis vs System.nanoTime

System.currentTimeMillis vs System.nanoTime
EN

Stack Overflow用户
提问于 2008-12-09 01:58:48
回答 8查看 415.4K关注 0票数 398

精度与Precision

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

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

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

有什么建议/评论吗?

EN

回答 8

Stack Overflow用户

发布于 2012-02-17 00:03:33

因为没有人提到过这个…

在不同的JVM之间比较System.nanoTime()调用的结果是不安全的,因为每个JVM可能有一个独立的“起始”时间。

System.currentTimeMillis()将在JVM之间返回(近似)相同的值,因为它与系统挂钟时间相关。

如果您想要计算两个事件(如秒表)之间经过的时间量,请使用nanoTime();系统挂钟中的更改会使currentTimeMillis()在此用例中不正确。

票数 110
EN

Stack Overflow用户

发布于 2008-12-09 06:06:05

Arkadiy更新:我在OracleJava8中观察到System.currentTimeMillis()在Windows7上更正确的行为。时间以1毫秒的精度返回。OpenJDK中的源代码没有更改,所以我不知道是什么原因导致了更好的行为。

Sun的David Holmes在几年前发表了一篇博客文章,非常详细地介绍了Java (特别是System.currentTimeMillis()System.nanoTime())、您希望在什么时候使用它们以及它们是如何在内部工作的。

Inside the Hotspot VM: Clocks, Timers and Scheduling Events - Part I - Windows

Windows上的Java为具有timed wait参数的API使用的计时器的一个非常有趣的方面是,计时器的分辨率可以根据系统范围内(不仅仅是在特定进程中)进行的其他API调用而改变。他展示了一个使用Thread.sleep()将导致此分辨率更改的示例。

票数 59
EN

Stack Overflow用户

发布于 2013-09-25 08:28:57

正如其他人所说,currentTimeMillis是时钟时间,由于夏令时(不是:夏令时和时区与currentTimeMillis无关,其余的都是真的)、用户更改时间设置、闰秒和互联网时间同步而改变。如果您的应用程序依赖于单调递增的运行时间值,那么您可能更喜欢nanoTime。

你可能会认为玩家在玩游戏时不会摆弄时间设置,也许你是对的。但不要低估互联网时间同步或远程桌面用户造成的干扰。nanoTime应用编程接口不会受到这种干扰的影响。

如果您想使用时钟时间,但又要避免由于互联网时间同步而造成的中断,您可以考虑使用NTP客户端,例如Meinberg,它会将时钟频率调到零,而不是定期重新设置时钟。

我是从个人经验说的。在我开发的一个天气应用程序中,我得到了随机出现的风速峰值。我花了一段时间才意识到,我的时基被一台典型PC上的时钟时间行为打乱了。当我开始使用nanoTime时,我所有的问题都消失了。一致性(单调性)对我的应用程序来说比原始精度或绝对精度更重要。

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

https://stackoverflow.com/questions/351565

复制
相关文章

相似问题

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