0

Java で関数の実行時間を取得する必要があります。私は使用できる 2 つの方法を認識しています: currentTimeMillis();nanoTime();しかしcurrentTimeMillis();、壁時計の時間が必要な場合 (つまり、壁時計から実行にかかった時間を測定しているかのように) がより正確であることを学びました。処理ではありません。時間)。

しかしcurrentTimeMillis();、私に小さな分数を与えることはできません。たとえば、実行時間が 1 ミリ秒未満の場合は 0 を返します。1 未満の時間でも、たとえば 0.05 ミリ秒が必要です。これは、メソッドが 0 を返す場合の簡単な例です。

long startTime=System.currentTimeMillis();
for(int x=0; x<10;x++)
{
    System.out.println("-");
}

long execTime=System.currentTimeMillis() - startTime;

時刻を返しても、30 か 40 として返されます。しかし、もっと正確な数値、たとえば 30.00012 が必要です。また、メソッドの戻り値の型は浮動小数点数が欲しいのでlong変更しましたdoubleが、これに害はありますか? Java メソッドの実行ウォールクロック時間を小さい分数 (8.0 ではなく 8.287335 など) で測定できる適切な方法を教えてください。

4

3 に答える 3

6

私は使用できる2つの方法を知っています:currentTimeMillis()nanoTime()。しかしcurrentTimeMillis()、実時間が必要な場合(つまり、処理時間ではなく、実時間から実行にかかった時間を測定しているように)、より正確であることがわかりました。

それは部分的にしか正確ではありません。

どちらの関数も、CPU時間ではなく、実時間を返します。

精度以外の違いはcurrentTimeMillis()、よく知られている時点にnanoTime()関連しているのに対し、任意の時点に関連していることです。nanoTime()これは、結果をあなたと私が理解できるタイムスタンプに簡単に変換できないことを意味します。

それでも壁掛け時計の間隔を測定するために使用できます。2nanoTime()回電話して差をとるだけです。それはほとんどそれが設計されたものです。

最後に、これを使用してコードのプロファイルを作成している場合は、「Javaで正しいマイクロベンチマークを作成するにはどうすればよいですか?」を参照してください。微妙な点がたくさんあります。

于 2013-01-05T15:50:12.477 に答える
1

System.nanoTime()ナノ秒の精度で使用できます。

于 2013-01-05T15:50:22.363 に答える
0

ただし、nanoTime を使用して、コード ブロックの最も正確な実行時間を取得する必要があります。ただし、実行時間に影響を与える外部の問題が多数あるため、注意して使用する必要があります。

たとえば、最近実行されていないメソッドが呼び出されると、メソッドをキャッシュに入れるためのオーバーヘッドが発生します。同じページに他に何があるかによっては、ディスクを読み取ってメモリに入れることさえあるかもしれません。

JVM は、メソッドを何度も実行する場合と比べて、1 回だけ実行する場合とでメソッドを異なる方法で処理する場合があります。

一般に、マイクロ秒を気にするのは、測定対象がジョブまたはトランザクションで何度も実行されるためです。その正確な測定値を取得するには、多くの呼び出しにわたって測定する必要があります。これにより、nanoTime を呼び出すためのオーバーヘッド時間の影響も軽減されます。

于 2013-01-05T16:07:08.690 に答える