System.currentTimeMillis vs System.nanoTime

2022-08-31 04:39:05

准确性与精度

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

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

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

任何建议/意见?


答案 1

如果您只是在寻找经过时间的极其精确的测量值,请使用 。 将为您提供自纪元以来最准确的可能经过时间(以毫秒为单位),但会为您提供相对于某个任意点的纳秒级精确时间。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.nanoTime()JavaDoc System.currentTimeMillis()。


答案 2

由于没有其他人提到这一点...

比较不同JVM之间的调用结果是不安全的,每个JVM可能具有独立的“原点”时间。System.nanoTime()

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

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