System.currentTimeMillisとSystem.nanoTimeの比較 質問する

System.currentTimeMillisとSystem.nanoTimeの比較 質問する

正確さと精度

私が知りたいのは、ゲーム内でオブジェクトの位置を更新するときに、System.currentTimeMillis()System.nanoTime() のどちらを使用する必要があるかということです。動きの変化は、最後の呼び出しからの経過時間に直接比例するので、できるだけ正確にしたいと思っています。

異なるオペレーティング システム間では、時間解像度に関する重大な問題があると読みました (具体的には、Mac / Linux の解像度はほぼ 1 ミリ秒ですが、Windows の解像度は 50 ミリ秒です)。私は主に Windows でアプリを実行していますが、50 ミリ秒の解像度はかなり不正確であるように思われます。

私が挙げた 2 つの選択肢よりも良い選択肢はあるでしょうか?

何かご提案やご意見はございますか?

ベストアンサー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()詳細については。

おすすめ記事