小编典典

System.currentTimeMillis vs System.nanoTime

all

准确性对比 精确

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

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

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

有什么建议/意见吗?


阅读 89

收藏
2022-03-23

共1个答案

小编典典

如果您只是在寻找 经过时间 的极其精确的测量值,请使用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;

另请参阅:JavaDoc
System.nanoTime()
JavaDoc
System.currentTimeMillis()
了解更多信息。

2022-03-23