2

Java 仮想マシンを System.nanoTime () と同期することは理にかなっていますか?

つまり :

  • System.nanoTime () を呼び出し、結果を t1 に入れる
  • AがBにパケットを送る
  • A からのパケットが B で受信されると、B は System.nanoTime() を呼び出し、結果を A に送信します。
  • B からのパケットが A で受信されると、A は System.nanoTime() を呼び出し、結果を t3 に入れ、B からのパケットで受信した時間を t2 に入れる
  • タイムシフト = (t3 - t1) / 2 - t2

System.nanoTime を使用してそれを行うのは正しいですか?

ありがとう !

4

3 に答える 3

8

System.nanoTime を使用してそれを行うのは正しいですか?

No.は、複数の JVM 間の絶対時間ではなく、単一の JVM 内の時間System.nanoTime()を測定する場合にのみ役立ちます。

このメソッドは、経過時間を測定するためにのみ使用でき、システム時間またはウォールクロック時間の他の概念とは関係ありません。返される値は、固定されているが任意の起点時刻からのナノ秒を表します (おそらく将来であるため、値は負の可能性があります)。Java 仮想マシンのインスタンスでは、このメソッドのすべての呼び出しで同じオリジンが使用されます。他の仮想マシン インスタンスは別のオリジンを使用する可能性があります。

この問題を解決するには、一般に を使用しますSystem.currentTimeMillis()が、それでも 2 台のコンピューターの OS クロックによって制限されます。NTP を使用して、コンピューター間で時刻を同期します。

Java を使用したサーバーとインターネット間の時刻同期 を参照してください。

于 2011-10-13T11:09:10.300 に答える
1

System.nanoTime() は、任意の特定されていない時点に関連しています。私が観察したところ、それはコンピューターの稼働時間によるものと思われます。

これにより、2 台のマシンで nanoTime を比較することが非常に難しくなります。

timeshift = (t3 + t1) / 2 - t2; // note the + instead of -

使用した式は、2 台のマシン間の差を概算するために使用できますが、非常に大きな差異を示す可能性があります。これを回避する 1 つの方法は、これを 1000 回実行して平均または中央値を取ることです。これにより、過去に安定した結果が得られました。

温度によってもナノタイマーの速度が速くなったり遅くなったりする可能性があるため、この数値は定期的に更新する必要があります。

注: 2 台のマシンを確実にミリ秒以内に保つことは、驚くほど困難です。;)

于 2011-10-13T11:14:28.313 に答える
0

あなたが達成しようとしていることは完全には明らかではありません。

クロックを同期しようとしている場合は、NTPなど、これに特化したプロトコルがあります。nanoTime()その値は JVM 間で比較できないため、どのような場合でもこれには役に立ちません。

レイテンシーを測定しようとしている場合は、ラウンドトリップ ( t3-t1) を繰り返し測定し、2 で割ります。このために、nanoTime()実際に使用できます。

于 2011-10-13T11:09:30.847 に答える