web-dev-qa-db-ja.com

2つのnanoTimeオブジェクトを減算して意味のある結果を得るにはどうすればよいですか?

リクエストの長さを監視するフィルターを作成しました。

long start = System.nanoTime();

...

long end = System.nanoTime();

これからミリ秒数を取得するにはどうすればよいですか?

12
Blankman
_(end - start) / 1000000
_

1マイクロ秒= 1000ナノ秒

1ミリ秒= 1000マイクロ秒

結果は切り捨てられますが、通常、真のナノ秒精度は得られないことに注意してください(精度はOSによって異なります)。 nanoTime()のJavadocから:

この方法はナノ秒の精度を提供しますが、必ずしもナノ秒の精度である必要はありません。

43
Chris Lercher

また、TimeUnitクラスを使用して変換を支援できることにも注意してください。古いバージョンのJavaでは、次のコードは、処理時間を他の時間形式に変換する例である可能性があります。

long startTime = System.nanoTime();

//Processing in-between.

long endTime = System.nanoTime();
long duration = endTime - startTime;
duration = TimeUnit.SECONDS.convert(duration, TimeUnit.NANOSECONDS);

Javaの新しいバージョンでは、TimeUnitクラスにショートカットがあることに注意してください。

上記のサンプルは、ナノ秒の長さを秒に変換します。また、これにより切り捨てられるため、精度がいくらか失われることに注意してください。したがって、分に切り替えると、秒の精度が失われます。 「12分32秒」の結果を取得したい場合は、このソリューションでさらに処理を行う必要があります。

10
BoBoCoding
TimeUnit.NANOSECONDS.toMillis(end - start);

それで全部です!

3
YujiSoftware

それらを引き、結果を10 ^ 6で割るだけです。

1ナノ秒は10 ^ -9秒であり、それに対応して10 ^ -6ミリ秒です。
http://en.wikipedia.org/wiki/Nano-

2
Nikita Rybak

意味のある結果を得るには:

void procedure ( ... )
{
     ...
}

double measureProcedure ( double epsilon , ... )
{
    double mean ;
    double stderr = 2 * epsilon ;
    while ( stderr > epsilon )
    {
         long start = System.nanoTime();
         procedure ( ... ) ;
         long end = System.nanoTime();
         // recalculate mean , stderr 
    }
    return ( mean / 1000000 ) ;
}
1
emory

System.currentTimeMillis() を使用できます。

警告:

戻り値の時間の単位はミリ秒ですが、値の粒度は基盤となるオペレーティングシステムによって異なり、それよりも大きくなる場合があることに注意してください。たとえば、多くのオペレーティングシステムは、数十ミリ秒の単位で時間を測定します。

0
harto