1. ホーム
  2. java

[解決済み] System.currentTimeMillisとSystem.nanoTimeの比較

2022-03-24 13:46:14

質問

正確さ 対 精密さ

を使うべきかどうかを知りたいのです。 System.currentTimeMillis() または System.nanoTime() というのは、ゲーム中のオブジェクトの位置を更新するときでしょうか? オブジェクトの動きの変化は、最後の呼び出しからの経過時間に正比例し、私はできるだけ正確にしたいです。

私は、異なるオペレーティングシステム間で深刻な時間分解能の問題があることを読みました(つまり、Mac / Linuxはほぼ1msの分解能であるのに対して、Windowsは50msの分解能?) 私は主にWindowsでアプリを動かしていますが、50msの解像度はかなり不正確なようです。

私が挙げた2つ以外に良い選択肢はあるのでしょうか?

ご意見・ご感想があればお聞かせください。

解決方法は?

を極めて正確に測定したいだけならともかく、そうでないなら 経過時間 を使用します。 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() をご覧ください。