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 に関連する問題でしょうか?