我有一个计算 n 体问题的 Java 程序。在每次迭代中,它都会检查每个物体对其他物体施加的力,然后根据这些力移动它们。
身体总是从同一个地方开始(我把它们排列成一个圆圈,从身体 0 到身体 n),它们总是被检查并以相同的顺序移动(从身体 0 到 n)。但是,当我运行该程序 30 次时,我得到的运行时间截然不同。一个运行时间为 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;
除了计算步骤之外,这是否测量任何其他内容?
第二次编辑-现在我将其更改为像这样测量时间:
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
long startUserTimeNano = bean.getCurrentThreadUserTime();
// ... Code to do the stuff...
double taskUserTimeNano = (bean.getCurrentThreadUserTime() - startUserTimeNano);
CPUmillisecondsElapsed += taskUserTimeNano/1000000.0;
然而,结果仍然不可重复。我还尝试使用标志 -Xint 运行我的程序,结果仍然不可重复。
假设问题出在算法和多线程中是否安全?或者它仍然是与Java有关的问题吗?