1

私は自分のジレンマに対する答えを探していて、いくつかの役立つヒントを見つけましたが、私の特定の質問に対処するものは何もありませんでした.

Javaでミリ秒単位の正確な経過時間を取得しようとしています。System.nanoTime() を使用して現在の時刻を取得し、次のコードに実装しています。これは、精度をテストするために使用したコードです。

長い startTime = System.nanoTime()/1000000;
while (true)
{
System.out.println((System.nanoTime()/1000000)-startTime);
}

出力の一部は次のようになります。

1110
1112
1112
1113
1114
1118
1120

最初の桁は秒、2 番目は 10 分の 1 秒、3 番目は 100 分の 1、最後は 1000 分の 1 です。ここには表示されませんが、100 分の 1 までの精度があります。番号のスキップや繰り返しはありません。ただし、1000 分の 1 は正確とは言えません。0 -> 2 -> 2 -> 3 -> 4 -> 8 -> 0。ミリ秒単位の精度を提供できます。

私は何か間違ったことをしていますか、それともミリ秒単位の精度を得ることができる別の方法はありますか?

4

3 に答える 3

2

ここには2つの要素があります。

まず、System.nanoTime()必ずしも実際に正確であるとは限りません。使用可能な最高の時計を使用するだけです(時計の変更に追従しないため、後方に移動したり、前方にジャンプしたりすることはありません)。

次に、Javaプログラムだけがコンピューターで実行されているプログラムではありません。そのため、コード(基本的にはネイティブnanoTime関数の呼び出しと結果の出力)の所要時間は毎回異なります。たとえば、1つの出力に1ミリ秒以上かかるのに対し、別の出力には0.5ミリ秒以下しかかからない場合があります。

さらにいくつかの桁を出力してみてください(つまり、より小さな数で除算してください)。結果は理解するのに役立ちます。

于 2011-03-29T17:49:38.700 に答える
0

java.time

古い日時クラスは現在、java.time クラスに取って代わられています。

java.time クラスは、ナノ秒までの解像度をサポートします。ただし、実際の解像度と精度は、ホスト コンピューターのハードウェア クロックに依存することに注意してください。したがって、結果異なります。

Instant instant = Instant.now();  

2016-01-02T12:34:56.123456789Z

可能なナノ秒の解像度をミリ秒に減らすには、メソッドを呼び出しますInstant::truncatedTo

Instant instantTruncated = Instant.now().trucatedTo( ChronoUnit.MILLIS );

2016-01-02T12:34:56.123Z

ほとんどのコンピューターのハードウェア クロックは、ミリ秒、マイクロ秒、ナノ秒の粒度ではあまり正確ではないことに注意してください。


マイナー ノート: java.time クラスはナノ秒単位の解像度の格納をサポートしていますが、Java 8 のレガシー実装は、現在の瞬間をナノ秒単位ではなくミリ秒単位でキャプチャClockすることに制限されています。Java 9は の新しい実装をもたらすため、ホスト コンピューターのクロック ハードウェアとホスト OS の機能に応じて、現在の瞬間を最大ナノ秒の解像度でキャプチャできます。Clock

于 2016-09-19T00:48:05.120 に答える
0

Divide by 1 million after the subtraction, and use a long literal.

long startTime = System.nanoTime();

while (true)
{
    System.out.println((System.nanoTime() - startTime)/1000000L);
}

Demo (updated): http://ideone.com/X5RRa

于 2011-03-29T17:11:40.693 に答える