システム。currentTimeMillis vsのシステム。nanoTime
-
20-08-2019 - |
質問
精度Vs.精密
僕が知するかどうかを使えばいいか迷ってい システム。currentTimeMillis() または システム。nanoTime() アップデートされる際には私のオブジェクトの位置を自分ですが---。その変化を移動度が大きくなりますので、時間経過以降、前回の通話とになりたいとして精密です。
このままがいくつかの深刻な時間解像度の課題と異なる営業システム(そのMac/Linuxしてほぼ1ms分解能をWindowsには、入光時50ms分解能??).私primarly走私のアプリをwindowsおよび入光時50ms決議いか誤りである。
がより良いオプションについ市場第一部に上場しています
提案/コメント?
解決
あなただけののを経過時間の非常に正確な測定を探しているなら、System.nanoTime()
使用。 System.currentTimeMillis()
あなたのエポックからのミリ秒単位の最も正確な可能性の経過時間を与えるだろうが、<=>あなたにいくつかの任意の点に対するナノ秒の正確な時間を、与えます。
Javaドキュメントから:
public static long nanoTime()
ナノ秒で、最も正確な利用可能なシステムタイマーの現在の値を返します。
この方法だけに使用することができます 経過時間を計測していません システムの他の概念に関連します または壁時計時間。値が返されます いくつかのため、ナノ秒を表し 固定されているが、任意の時間(おそらくに 将来的には、その値とすることができます 負)。この方法は、提供します ナノ秒の精度ではなく、 必ずしも精度をナノ秒。番号 保証はどの程度作られています 頻繁に変化する値。違い 大きいまたがる連続通話で (2 63 約292年以上 ナノ秒)ではない正確になります 数値による経過時間を計算します オーバーフローます。
例えば、いくつかのコードの実行に要する時間を測定する
long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
も参照してください:のJavaDocシステム。 nanoTime()とのJavaDoc System.currentTimeMillis()は、詳細はを。
他のヒント
誰も...
これを言及していないので、異なるスレッド間の呼び出しSystem.nanoTime()
の結果を比較するのは安全ではありません。スレッドのイベントが予測可能な順序で起こる場合であっても、ナノ秒の差が正または負になることができます。
System.currentTimeMillis()
スレッド間の使用のために安全である。
Arkadiyするによってアップデート:私は、OracleのJava 8のWindows 7上でSystem.currentTimeMillis()
のより正確な振る舞いを観察してきました。時間は1ミリ秒の精度で返されました。 OpenJDKのソースコードは、私はより良い行動を起こすかわからない、変更されていません。
日のデヴィッド・ホームズは(特にSystem.nanoTime()
とThread.sleep()
)JavaのタイミングAPIので非常に詳細な外観を持って、ときにどれを使いたいだろうと数年前のブログ記事を投稿し、そしてそれらがどのように動作します内部ます。
HotSpot VMの内側:時計、タイマーやスケジュールイベント - パートI - Windowsのの
だけでなく、中(システムワイド -、時限待機パラメータを持っているAPIのWindows上のJavaが使用するタイマーの1つの非常に興味深い点は、タイマの分解能は呼び出しが行われた可能性があり、他のどのようなAPIに応じて変更することができるということです特定のプロセス)。彼はこの解像度変更が発生します<=>を使用する例を示します。
System.nanoTime()
は古いJVMではサポートされていません。それが懸念される場合は、currentTimeMillis
精度について、あなたはほとんど正しいです。一部のWindowsマシンでは、currentTimeMillis()
については10ms(ない50ミリ秒)の解像度を持ちます。私がなぜわからないんだけど、いくつかのWindowsマシンはLinuxマシンと同じくらい正確である。
私は、中程度の成功を収めて、過去に GAGETimer に使用しています。
、にcurrentTimeMillisは、夏時間のために変化する、クロック時間であるユーザーは、時間設定、うるう秒、およびインターネット時刻の同期を変更します。あなたのアプリが単調に経過時間値の増加に依存している場合は、代わりにnanoTimeを好むかもしれません。
あなたは、プレイヤーがゲームプレイ中に時間設定をいじることはありませんと思うかもしれない、と多分あなたは正しいだろう。しかしによるインターネット時刻同期、またはおそらくリモートデスクトップユーザーに混乱を過小評価しないでください。 nanoTimeのAPIは、混乱のこの種に免疫があります。
あなたは時計の時間を使用しますが、インターネット時刻の同期のために不連続を避けたい場合は、あなたがそのようなクロックレートは中にそれをゼロにする「曲」マインベルク、とNTPクライアントを考えるのではなく、単に定期的に時計をリセットするかもしれません。
私は個人的な経験から話します。私が開発した天気予報アプリケーションでは、私はランダムに風速スパイクを発生してきました。私は私のタイムベースは、一般的なPC上のクロック時間の行動によって破壊されていたことを実現するのは時間がかかりました。私はnanoTimeを使い始めたときに私のすべての問題が消えました。一貫性(単調性)は、生の精度または絶対精度よりも自分のアプリケーションにとってより重要でした。
はい、そのような精度がSystem.nanoTime()
使用を必要としていますが、その後のJava 5+ JVMを必要としていることに注意してください。されている場合
私のXPシステムでは、私は次のコードを使用して、少なくとも<ストライキ> 100マイクロ秒ストライキ> 278 のナノ秒のに報告されたシステム時刻を参照してください
private void test() {
System.out.println("currentTimeMillis: "+System.currentTimeMillis());
System.out.println("nanoTime : "+System.nanoTime());
System.out.println();
testNano(false); // to sync with currentTimeMillis() timer tick
for(int xa=0; xa<10; xa++) {
testNano(true);
}
}
private void testNano(boolean shw) {
long strMS=System.currentTimeMillis();
long strNS=System.nanoTime();
long curMS;
while((curMS=System.currentTimeMillis()) == strMS) {
if(shw) { System.out.println("Nano: "+(System.nanoTime()-strNS)); }
}
if(shw) { System.out.println("Nano: "+(System.nanoTime()-strNS)+", Milli: "+(curMS-strMS)); }
}
私は nanotimeするとの良好な経験を持っていました。これは、JNIライブラリを使用して、2つのlong型(つまり秒以内エポックとナノ秒からの秒)と壁時計の時間を提供します。これは、WindowsとLinuxの両方のためのプリコンパイルJNIの一部で利用可能です。
ゲームグラフィック-滑らかな位置の更新に使用 System.nanoTime()
よ System.currentTimeMillis()
.り換えてからcurrentTimeMillis()をnanoTime()でゲームを得ることができた主要な視覚の改善の滑らかさ。
らのミリ秒あたりがでている必要されるものの、視覚的にではありません。の要因 nanoTime()
の改善など
- 正確なピクセル位置決め以下の壁時計の分解能
- 能力-抗エイリアスとピクセルしたい場合は、
- Windows壁クロック精度
- クロックジッター(矛盾が壁クロックを実際に目盛み)
その他の回答が示すように、nanoTimeいコストパフォーマンスで呼び出される場合は繰り返しであれば最適でに数回フレームをし、同じ値を算出す全体フレーム。
System.currentTimeMillis()
は、経過時間のために安全ではありません。
あなたはSystem.nanoTime
使用する必要があります。
Javaシステムのヘルプを参照してください。
nanoTime方法についてます:
- あなたは<=>あなたの経過時間を使用している場合は、..この方法では、ナノ秒の精度を提供しますが、必ずしもそうではありません ナノ秒の分解能(つまり、ある頻度値の変更) - なし 保証は、解像度が少なくとも同じくらい良好であることを除いて作られています currentTimeMillis()のよう..
(将来へ戻る<)負になることができます
一つのことはmethod.itが同じinput.currentTimeMillisのために非常に一貫性のある値を与えるものではありませんnanoTimeの矛盾は、パフォーマンスと一貫性の面ではるかに優れていて、また、nanoTimeほど正確ではないが、下を持っています誤差の範囲、およびその値のため、より精度。私はそのため、あなたがにcurrentTimeMillisを使用することを示唆している。