System.currentTimeMillis()は、Javaでの時間のパフォーマンスの最適な指標ですか?
-
21-08-2019 - |
質問
のSystem.currentTimeMillis()は、Javaでのタイムパフォーマンスの最適な指標でありますか?アクションが時間に取られる前に、アクションが取られた後の時間を比較するために、これを使用して、任意の落とし穴年代はありますか?より良い代替手段はありますか?
解決
私はないと思い - 私は<のhref = "http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#を使用していないとき、それは私が使用しているものですnanoTime()」REL = "noreferrer"> nanoTime()
の
他のヒント
System.nanoTime()
のほか、JMXはおそらく最良の実行可能な選択肢です。
java.lang.management.ManagementFactory.getThreadMXBean()
あなたは(System.nanoTime
用として、ナノ秒の精度でナノ秒単位で測定ではなく、())現在のスレッドのCPU時間を照会することができます。
あなたはを使用することができます測定可能Googleのグアバするからストップウォッチの時間の超簡単ます。
このを見てみましょう。
、System.nanoTimeのは良い選択です。うるう秒、NTPの更新とジッタだけでなく、ユーザーが*システムクロックを設定する - のSystem.currentTimeMillisは、UTCのタイミング変動を受けやすいです。これは、タイミングアプリケーションの特定の種類のいくつかの壮観な障害を引き起こす可能性があります。 System.nanoTimeのは、すべてのものに免疫することになっています。
のSystem.nanoTimeの問題が(ユーザーが単独のシステムクロックを残すものとする)より長い時間スパンのためのSystem.currentTimeMillisが良くなって、定期的な数値オーバーフローや長期のタイミングの不正確さが含まれています。夏時間とタイムゾーンの変更はのSystem.currentTimeMillisに影響を与えるべきではないことに注意します。
* Windowsの「インターネット時刻と同期するには、」段階的な変更を行います。クライアントのタイムベース周波数を調整することで、サーバーを「追う」ことを適切なNTPクライアントの実装とは対照的に、これは、非常に破壊的なことができます。
のJava 1.5の前だけにSystem.currentTimeMillisがありました。しかし、値の粒度は、基礎となるオペレーティング・システムに依存し、大きくてもよいです。 Windows XPでは、私は時々は20msのギャップになってしまいました。私はLinuxは1-2msの範囲のギャップでずっといいです聞いています。
のJava 1.5を使用すると、またSystem.nanoTimeのを使用することができます。私はこの1つの問題を持っていたことはありません。
一つの落とし穴は、CPU時間、この経過をリアルタイムに計測していることではありません - それは、システムの負荷に非常に依存しています。他のプロセスが仕事をしようとしている場合、これはあなたの場合はそうでない自由なマシンで結構ですが、時には、興味深い結果を生み出すことができます。
この記事では問題にのintersting解決策を持っています。