質問

まず最初に、これらは非常に基本的で原始的な質問であることを認めなければなりません...Java でソートと検索のためのさまざまなアルゴリズムを示し、ランタイムの値を取得したいと考えています。解決できない問題があります:

  1. ホットスポットコンパイルがあります - これは非アクティブ化する必要があるランタイム最適化です(おそらく)。

  2. ランタイムの時間値 (秒) を取得するにはどうすればよいですか?実行前にタイマーを開始し、実行後にタイマーを停止します...少し原始的なようです。そして、タイマーオブジェクト自体がランタイムを消費します...それは避けなければなりません。

これらの問題を解決するために Java API に利用できるものはありますか?

感謝 クラウス

役に立ちましたか?

解決

  1. -Xint JVMフラグを使用します。その他のオプションについては、こちらをご覧ください。

  2. を使用する ThreadMXBean APIは、スレッドのCPU /ユーザー時間を取得します。例はこちらで見ることができます。

他のヒント

コマンドラインで -Xint を使用してHotSpotを無効にすると、パフォーマンスが大幅に低下します。ただし、実際のパフォーマンスを測定したくないのはなぜですか?コンパイルすると、さまざまなことがボトルネックになる可能性があります。

一般にマイクロベンチマーク用:

  • System.nanoTime を使用して、開始時と終了時の時間測定値を取得します
  • 妥当な時間実行
  • 何度か測定を行います(「ウォームアップ」があります)
  • 異なるアルゴリズムの測定値をインターリーブしない
  • 測定セグメントでI / Oを行わない
  • 結果を使用する(HotSpotは些細な操作を完全に最適化できます)
  • 実世界の状況(または可能な限りクローエ)でそれを行う
  • デュアルコアが一般的であり、より多くのコアが正常になることを忘れないでください

System.nanoTime() を 2 回使用すると、消費される時間は 1 マイクロ秒未満になります。マイクロ秒の誤差が重大にならないように、ベンチマークを数秒間実行して平均をとることをお勧めします。

全体として、必要以上に物事を複雑にしないことをお勧めします。

ウォームアップを組み込むために、私は反復の最初の 10% ~ 20% を無視することがよくあります。何かのようなもの

long start;
int count;
for(int i = -count / 5; i < count; i++) {
    if (count == 0) start = System.nanoTime();
    // do tested code
}
long time = System.nanoTime() - start;
long average = time / count;
System.out.printf("Average time was %,d micro-seconds%n", average / 1000);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top