2

n体問題を計算するJavaプログラムがあります。反復ごとに、各ボディが他のすべてのボディに及ぼす力をチェックし、力に従ってそれらを動かします。

ボディは常に同じ場所から始まり (ボディ 0 からボディ n まで円形に配置されています)、常に同じ順序 (ボディ 0 から n) で検査および移動されます。ただし、プログラムを 30 回実行すると、実行時間が大幅に異なります。1 つの実行時間は 2,947,188 ミリ秒 (49 分) で、別の実行時間は 920,967 ミリ秒 (15 分) です。私はたくさんの体に総当たり法 (O(n^2)) を使用しているので、これらの時間の大きさに驚かされません。しかし、なぜ決定論的アルゴリズムにこのような差異があるのか​​ 疑問に思っていますか? それが何度も同じアルゴリズムである場合、実行時間は同じ(または少なくとも近い)べきではありませんか?

あなたが尋ねる前に、はい、私は実測時間ではなく、計算を行うスレッドの時間を測定しています。

編集- 私はこのように時間を測定しています:

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
long startUserTimeNano = bean.getCurrentThreadCpuTime();

// ... Code to do the stuff...

double taskUserTimeNano = (bean.getCurrentThreadCpuTime() - startUserTimeNano);
CPUmillisecondsElapsed += taskUserTimeNano/1000000.0;

これは計算ステップ以外の何かを測定しますか?

2 番目の編集- 次のように時間を測定するように変更しました。

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
long startUserTimeNano = bean.getCurrentThreadUserTime();

// ... Code to do the stuff...

double taskUserTimeNano = (bean.getCurrentThreadUserTime() - startUserTimeNano);
CPUmillisecondsElapsed += taskUserTimeNano/1000000.0;

ただし、結果はまだ再現できません。また、フラグ -Xint を使用してプログラムを実行しようとしましたが、結果はまだ再現できませんでした。

問題がアルゴリズムとマルチスレッド内にあると想定しても安全ですか? それとも、まだ Java に関連する問題でしょうか?

4

3 に答える 3

1

正確に時間を計っていますか?ユーザーには見えない jvm 内で実行されている多くのスレッドが存在する可能性があります。システム時刻を取得すると、それらのスレッドの存在が無視されます。また、他のスレッドを実行している場合は、それらが追加された時間を無視している可能性があります。

于 2011-04-01T18:55:04.110 に答える
1

マルチスレッド プログラムのベンチマークは、動的コンパイル、ガベージ コレクション、適応最適化のために困難な場合があります。Brian Goetz の「Java Concurrency in Practice」の第 12 章を読むことをお勧めします。

于 2011-04-01T18:57:14.183 に答える
0

タイミングを計っているスレッドが多くのスレッドの 1 つにすぎないと仮定すると、スレッドでの計算の開始時間と終了時間の差分を取得するだけでは、スレッドが実際に使用した CPU 時間を測定することにはなりません。他のスレッドと競合し、他のスレッドの実行中に一時停止/待機する必要がありますが、待機している時間もカウントされます。

スレッドのスケジュール方法はさまざまであり、ガベージ コレクションも考慮する必要があるため、スレッドの開始から終了までにかかる合計時間は大きく異なります。ただし、実際に必要な CPU 時間は変わりません。

編集

測定する必要があるのは、スレッドがユーザーモードで費やした時間だと思います。これにより、OS/JVM の待機に費やされた時間がなくなり、スレッドでの実行に費やされた時間のみが測定されます。ということで、使ってみてくださいgetCurrentThreadUserTime

私はそれについて以前のSOスレッドを見つけました: Javaでのスレッドユーザー時間とスレッドCPU時間の違い

于 2011-04-01T19:05:13.720 に答える