0

java(順次およびフォーク結合)でソートアルゴリズムをプロファイリングする良い方法を知っている人はいますか? 実行時間が短すぎるため (ソート リスト サイズ 5000..)、 System.nanoTime() が正しく動作していないようです。

同じテスト ケースを何度も (1000) 実行し、最初の 100 件の結果を取り除き (HotSpot コンパイラの問題を回避)、System.nanoTime() を使用して平均実行時間を計算する予定です。これに関する提案はありますか?

どうもありがとう!

このようにできますか?

double count = 0;
double start, end;
for(int r = 0; r < warmup; r++) {
    // do test
}
for(int t = 0; t < runs; t++){
    start = System.nanoTime();
    // do test
    end = System.nanoTime();
    count += start - end;
}
double avg = count/avg
4

3 に答える 3

2

実際の実行時間が短すぎてベンチマークできない場合は、おそらく最適化する価値はありません。

5000 個の要素のリストを並べ替えるだけの場合は、時期尚早に最適化するのではなく、最も単純なソリューションを使用することをお勧めします。リストが非常に大きい場合は、小さいリストではなく大きいリストでベンチマークを行う必要があります。

于 2010-12-02T21:20:52.247 に答える
1

nanoTime() が機能することは保証できます。すべてのホットスポット ウォームアップを回避したい場合は、10,000 回実行する必要があります。ある種の 5K 要素はかなり高速であり、1K テストでさえそれほど多くないことがわかるはずです。再現可能な結果を​​生成するテストを作成する必要があります。そうでない場合は、テストがあまり良くないため、テストを修正するのはあなた次第です。

試してみて、どのような結果が得られるかを確認することをお勧めします。

古いコンピューターでは、5K のランダムな int 値の並べ替えに約 500 us かかります。注: 並べ替えられた配列を並べ替えても、同じ結果は得られません。(そのため、毎回同じ配列をソートすることはできません)

最初の N 回の実行を無視して特定の回数テストを実行する簡単な方法は、実行することです。

long start = 0;
for(int r = -warmup; r < runs; r++) {
    if (r == 0) start = System.nanoTime();
    // do test
}
long avg = (System.nanoTime() - start)/runs;
于 2010-12-02T21:39:36.830 に答える
1

より大きなリストをソートすることから始めます。ベンチマーク時間を比較しようとしている場合は、50,000,000 要素の方が妥当だと思います。

于 2010-12-02T21:23:40.247 に答える