4

私はこの問題を抱えており、それを解決する方法がわかりません。
特定の機能を実行するのに必要な時間を測定する必要があります。さて、ミリ秒単位のストップウオッチ機能ではダメだったので、ナノ秒単位で計測してみました。

問題は、関数が非常に速く終了し、ナノ秒単位のストップウォッチでさえ測定できないことです。

たとえば、関数に入れようとしたためThread.sleep(1)(Thread.sleepはミリ秒単位です)、ストップウォッチが機能することを知っています。時間を取得しますが、なしThread.sleepでは、時間は常に0です.何かアイデアはありますか?

これが私のコードです:

long startTimeLocalNS=0;
long stopTimeLocalNS = 0;
startTimeLocalNS = System.nanoTime();
if (something)
{
    /*my Code;*/
}   
stopTimeLocalNS = System.nanoTime();
disconnectTime = (stopTimeLocalNS - startTimeLocalNS);
4

7 に答える 7

7

関数をループで数千回 (または数百万回) 実行し、合計時間を測定して反復回数で割ります。

ただし、マイクロベンチマークを作成する際の多くの落とし穴に注意してください。

于 2011-02-25T12:40:55.343 に答える
1

測定対象のコードを 1000 回ループしてから、nanoTime-difference を 1000 で割ります。

于 2011-02-25T12:41:59.033 に答える
1

コードをプロファイリングしていますか?もしそうなら、市場で入手可能なプロファイルは、はるかに優れた仕事をします.

非常に短い期間を測定する必要がある場合は、いくつかのオプションがあります。

  • System.currentTimeMillis()- 私のコンピューターでは解像度が 60 Hz で、約 16 ミリ秒の粒度が得られます。
  • System.nanoTime()- より正確だと思いますが、マルチコア CPU の時代には最速のソリューションではないと聞きました
  • JNI - C で時間を測定しますが、JNI 呼び出しのコストはかなりのものになります。
于 2011-02-25T12:43:17.927 に答える
1

次のようなことができます。

long startTimeLocalNS=0;
long stopTimeLocalNS = 0;
int count = 10000;
startTimeLocalNS = System.nanoTime();
if (something)
{
    while(count-- != 0) {
    /*my Code;*/
    }
}   
stopTimeLocalNS = System.nanoTime();
disconnectTime = (stopTimeLocalNS - startTimeLocalNS) / count;
于 2011-02-25T12:40:59.550 に答える
0

関数のベンチマークを行う場合、最も簡単な方法は、1 回の測定で複数回実行することです。次に、時間を呼び出しの量で割ります。

于 2011-02-25T12:41:19.170 に答える
0

JVM がウォームアップされているかどうかによって、非常に異なる答えが得られます。何度も呼び出す非常に短いシーケンスの場合。それらを繰り返すのにかかる時間を測定する必要があります。

于 2011-02-25T12:41:33.960 に答える
0

左のフィールドからの答え: Peter Lawrey が述べているように、ほとんどのシステムは、 への 2 つの呼び出しを比較すると、結果として 0 より大きい数値を返す必要がありますnanoTime()。しかし、正しい値を比較していると確信していますか? 誤ってこれを行っている可能性があります:

long startTime = System.nanoTime();
if (something)
{
    /*my Code;*/
}
long stopTime = System.nanoTime();
disconnectTime = stopTime - stopTime; //note the error - you are subtracting stoptime from itself

それで、私の質問は、上記のサンプル コードで再現されていないコードにバグがありますか?

2 番目の質問something==trueです。

于 2011-02-25T12:47:58.540 に答える