0

いくつかのメソッド ( ) の効率をチェックし、それらを全体的な実行時間と比較したかったのでfoo(int)、最終的に次のようなものを書きました。

void testNanoTime(){
    long methodDuration = 0;
    long testStart = System.nanoTime();
    for(int i= 0; i< 300; i++){

        long startJob = System.nanoTime();
        foo(i);  //checking how foo does with certain data.
        methodDuration+= System.nanoTime()-startJob;

        bar();
    }
    System.out.println("MethodDuration: "+methodDuration);
    System.out.println("TestDuration:   "+(System.nanoTime()-testStart));
}

foo(int)1 回の呼び出しで数分から 30 分 (合計で 293 年ではありません!) かかることもあります。問題は、TestDuration (メソッドにかかる時間全体) が methodDuration よりも小さい場合があることです。これは私には不可能に思えます。したがって、2 つの質問:

  • methodDurations を比較する古いテストはどれくらい有効ですか?
  • 無効なタイムスタンプを取得する危険を冒さずにパフォーマンスをさらにテストするには、何を使用すればよいですか? 行ってもSystem.currentTimeMillis()安全ですか、それとも同じ問題がありますか?

現在、テストは Linux システムで行われています。ここで、この問題に関するいくつかの古い質問と回答を既に見つけました (例: Is System.nanoTime() 完全に役に立たない? ) が、一部の状態は Windows の問題であり、他の回答は言及されているように不明なままです。数歳でも)。ほとんどの答えでさえ互いに矛盾しています!

4

1 に答える 1

1

Java プロファイリングは、JVM の動作に基づいてかなり複雑になります。

開始に役立つリソースを次に示します。

ナノタイムの詳細とその仕組みについては、ナノタイムは完全に役に立たないを読んでください

編集:OPは投稿を編集して「ナノタイムは完全に役に立たない」と言及しましたが、私見はまだ関連性があるため、回答に残しています。

于 2016-03-18T13:44:47.177 に答える