5

2つの異なるマシンでSystem.nanoTime()を呼び出した結果の2つの値を比較するのは正しいですか?System.nanoTime()は、プロセッサに依存するタイムスタンプカウンター(TSC)を使用して、任意の時点に対するナノ秒精度の時間を返すため、私はノーと言います。

私が正しければ、(Javaで)2つの異なるマシンでインスタントをキャプチャし、これらの値を少なくともマイクロ秒の精度またはナノタイムの精度で(安全に)比較する方法はありますか?

System.currentTimeMillis()は、直線的に増加する数のタイムスタンプを返さないため、解決策ではありません。ユーザーまたはNTPなどのサービスは、いつでもシステムクロックを変更でき、時刻は前後に跳ね上がります。

4

4 に答える 4

4

利用可能なさまざまなクロック同期アルゴリズムを調べることをお勧めします。どうやら、Precision Time Protocolは、LAN上でサブマイクロ秒の精度であなたを得ることができます。

特定の時間値は必要ないが、さまざまなイベントの順序を知りたい場合は、たとえば、ランポートタイムスタンプを使用できます。

于 2011-11-03T20:06:34.640 に答える
1

nanoTime2 台の異なるマシン間で使用することはできません。Java API ドキュメントの場合:

このメソッドは、経過時間を測定するためにのみ使用でき、システム時間またはウォールクロック時間の他の概念とは関係ありません。返される値は、固定された任意の時間からのナノ秒を表します (おそらく将来であるため、値は負の可能性があります)。

nanoTimeどのタイムベースに対しても相対的であるという保証はありません。

于 2011-11-03T20:28:19.950 に答える
0

時刻を現在のミリ秒単位で同期できます。ただし、NTP を使用している場合でも、マシン間で 1 ミリ秒から 10 ミリ秒ずれることがあります。マシン間をマイクロ秒単位で同期させる唯一の方法は、専用のハードウェアを使用することです。

nanoTime は、2 つの異なる OS で同じ方法で決定されるか、同じ解像度を持つことが保証されています。

于 2011-11-03T22:45:00.710 に答える
0

これはプロセッサと OS に依存する Q.たとえば、POSIX クロックを見ると、高精度の時刻認識タイムスタンプ (たとえば、CLOCK_REALTIME はナノエポック時間値を返す) と高精度の任意の時刻タイムスタンプ (たとえば、CLOCK_MONOTONIC) (注:これら2つの違いは、この回答でうまく説明されています)。

後者は多くの場合、ボックスが起動してからの時間のようなものであるため、最初に高精度のクロック同期(たとえば、他の回答で参照されているPTP)がない限り、サーバー間でそれらを正確に比較する方法はありませんそれらの間でオフセットを共有できます)。

NTP で十分かどうかは、何を測定しようとしているかによって異なります。たとえば、数百マイクロ秒の間隔を測定しようとしている場合 (たとえば、同じスイッチに接続されたボックス)、結果は粗くなります。逆に、サーバーが地理的に完全に異なる場所にある場合、NTP は完全に良好です。 (例: ロンドンから NY) これは、クロック同期効果が (それほど離れていない限り) ロケーション間のレイテンシーによって圧倒されることを意味します。

FWIW Java からそのようなクロックにアクセスするために必要な JNI はかなり簡単です。

于 2011-11-03T20:16:41.223 に答える