猿问

System.currentTimeMillis对System.NanTime

System.currentTimeMillis对System.NanTime

准确性VS。精密度

我想知道的是我是否应该用System.currentTimeMillis()System.NanTime()当更新我的目标在我的游戏中的位置?它们的运动变化与上次调用以来的时间成正比,我希望尽可能精确。

我读到过不同操作系统之间存在一些严重的时间分辨率问题(即Mac/Linux有将近1ms的分辨率,而Windows有50 ms的分辨率?)。我主要是在Windows上运行我的应用程序,而50 ms的分辨率看起来非常不准确。

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

有什么建议/意见吗?


智慧大石
浏览 485回答 3
3回答

尚方宝剑之说

如果你只是在寻找非常精确的测量耗用时间,使用System.nanoTime(). System.currentTimeMillis()将给出自那个时代以来最精确的经过时间(以毫秒为单位),但是System.nanoTime()给你一个纳秒精确的时间,相对于某个任意点。来自Java文档:public static long nanoTime()返回最精确可用系统定时器的当前值(以纳秒为单位)。这种方法只能用于测量经过的时间,而与系统或挂钟时间的任何其他概念无关。返回的值表示某个固定但任意时间的纳秒(可能在将来,因此值可能为负值)。这种方法提供纳秒精度,但不一定是纳秒精度。没有保证价值观变化的频率。持续时间超过292年的连续呼叫的差异(263由于数值溢出,无法精确计算经过的时间。例如,要度量某些代码执行所需的时间:long startTime = System.nanoTime();    // ... the code being measured ...    long estimatedTime = System.nanoTime() - startTime;另见:JavaDoc System.NanTime()和JavaDoc System.currentTimeMillis()想了解更多信息。

冉冉说

因为没有其他人提到这个…的结果比较是不安全的。System.nanoTime()不同线程之间的调用。即使线程的事件以可预测的顺序发生,以纳秒为单位的差异也可以是正的或负的。System.currentTimeMillis()在线程之间使用是安全的。
随时随地看视频慕课网APP

相关分类

Java
我要回答