2

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

  1. Hotspot コンパイルがあります。これは、無効にする必要があるランタイム最適化です (推測します)。

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

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

ありがとう、クラウス

4

3 に答える 3

5

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

通常、マイクロベンチマークの場合:

  • System.nanoTime開始時と終了時の時間測定を取得するために使用します
  • 適度な時間走る
  • 何度も測定を行います(「ウォームアップ」があります)
  • 異なるアルゴリズムの測定値をインターリーブしない
  • 測定されたセグメントで I/O を行わない
  • 結果を使用する (HotSpot は些細な操作を完全に最適化できます)
  • 現実世界の状況(または可能な限りクロエ)でそれを行う
  • デュアルコアが標準であり、より多くのコアが標準になることを覚えておいてください
于 2009-05-04T12:53:55.860 に答える
1
  1. -XintJVM フラグを使用します。その他のオプションについては、こちらを参照してください。

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

于 2009-05-04T12:54:13.860 に答える
1

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);
于 2009-05-04T19:00:36.490 に答える