У меня есть программа на 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?