4

System.nanoTime() を使用して、いくつかのメソッドを呼び出すのにかかる時間を測定しています。これらの各メソッドで、各メソッドにかかる時間を測定するために同じことを行います。結局、経過時間の合計は合計経過時間よりも小さいはずだ、と私は思った。しかし、そうではありません。

例:

public static void main(String[] args){
  long startTime = System.nanoTime();
  method1();
  method2();
  method3();
  System.out.println( "Total Time: " + (System.nanoTime() - startTime) / 1000000);
}
private void method1(){
  long startTime = System.nanoTime();
  //Stuff
  System.out.println( "Method 1: " + (System.nanoTime() - startTime) / 1000000);
}
// same for all other methods

私の場合、合計時間は約 950 ミリ秒ですが、各経過時間の合計は 1300 ミリ秒以上です。どうしてこれなの?

編集:

さて、少し明確にするために、配列に何度も書き込むときにこの動作が発生しません(これはテストとして行いました)。これを行うと、ほぼ正確な結果 (+-1ms) が得られます。

私が実際にやっていることはこれです:

2 つのかなり巨大なテキスト ファイルを文字列配列に読み込みました (最初のファイルで 1000 * ~2000 文字、2 番目のファイルで 200 * ~100 文字)。

次に、最初のファイルを読み取って取得した String 配列に対して多くの比較を行い、その結果を使用して確率を計算します。

EDIT2:私の側のエラーです。メソッド内でメソッドを呼び出していて、それらの時間も合計しましたが、これはすでに含まれています。これらの二重時間がなければ、すべてが加算されます。これをクリアしてくれてありがとう!

4

3 に答える 3

5

このことをさらに調査するために、各メソッドとグローバル プロセスの開始時刻と終了時刻を出力できます。ここでは、それぞれにかかった時間と合計時間を出力しているだけですが、次のように出力できます。

Global start   : (result of System.nanoTime() here)
Method 1 Start : ...
Method 1 End   : ....
Method 2 Start : ....
Method 2 End   : ....
Method 3 Start : ....
Method 3 End   : ....
Global end     : ....

GlobalEnd - GlobalStartこれを行うことをお勧めする理由は次のとおりです(End1-Start1) + (End2-Start2) + (End3-Start3)。しかし、この関係は実際には、すべてが連続的である場合、次のことが成り立つという事実から導き出されます。

GlobalStart <= Start1 <= End1 <= Start2 <= End2 <= Start3 <= End3 <= GlobalEnd

ではない?

次に、あなたにとって興味深いのは、この不等式のリストで何が正しくないかを知ることです. これにより、何らかの洞察が得られる可能性があります。

于 2013-02-11T20:03:47.293 に答える
1

あなたのコードに問題はありません。私のテストでは、コードから正しい経過時間を取得しました。

ここに私の出力があります:

方法 1: 600 方法 2: 500 方法 3: 10 合計時間: 1110 BUILD SUCCESSFUL (合計時間: 2 秒)

于 2013-02-11T19:00:25.483 に答える
0

do を次のように変更してみてください。

public static void main(String[] args)
{
    long elaspeTime = 0;
    elaspeTime += method1();
    elaspeTime += method2();
    elaspeTime += method3();
    System.out.println("Total Time: " + elaspeTime / 1000000);
}

private static long method1()
{
    long startTime = System.nanoTime();
    //Do some work here...
    System.out.println("Method 1: " + (System.nanoTime() - startTime) / 1000000);
    return System.nanoTime() - startTime;

}
于 2013-02-11T20:30:16.713 に答える