У меня есть программа на Java, которая вычисляет проблему с n телами. На каждой итерации он проверяет силы, которые каждое тело прилагает к каждому другому телу, а затем перемещает их в соответствии с этими силами.
Тела всегда начинаются в одном и том же месте (у меня они расположены по кругу, от тела 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?