Мне нужно сделать задание по программированию для университета.Задача состоит в том, чтобы реализовать программу, которая возвращает все решения уравнения q² + 3qp + p² = r² (q, p, r простых чисел).Впоследствии программа должна быть ускорена распараллеливанием.К сожалению, мы должны использовать BigInteger, так что не удивляйтесь.
Это мой класс, который я написал, который вычисляет именно это уравнение.
public boolean calculateEquation() {
//Equation: p² + 3pq + q² = r²
if (calculatePSquare().add(calculate3TimesPQ()).add(calculateQSquare()).equals(calculateRSquare())) {
System.out.println("p: " + p + " q: " + q + " r: " + r);
}
return calculatePSquare().add(calculate3TimesPQ()).add(calculateQSquare()).equals(calculateRSquare());
}
@Override
public void run() {
calculateEquation();
}
Полный код для этого класса: https://pastebin.com/wwrDurUT
Следующим моим шагом было проверить коди остановите время, чтобы увидеть, работает ли распараллеливание позже.Чтобы реализовать распараллеливание, я рассмотрел различные потоки, в том числе и ту, которая связана здесь: Какой самый простой способ распараллелить задачу в Java?
И это был мойрезультат:
ExecutorService executorService = Executors.newFixedThreadPool(Configuration.instance.maximumNumberOfCores);
ExecutorCompletionService executorCompletionService = new ExecutorCompletionService(executorService);
for (BigInteger pValue : possiblePValues) {
for (BigInteger qValue : possibleQValues) {
for (BigInteger rValue : possibleRValues) {
executorCompletionService.submit(new Thirteen(pValue, qValue, rValue), null);
}
}
}
executorCompletionService.take();
Полный код: https://pastebin.com/kviEnnFH
Теперь, что забавно, распараллеленная версия работает быстрее только при небольшом количестве задач.Для всех простых чисел от 0 до 500 параллельная версия работает быстрее.Если я возьму все простые числа от 0 до 2000, результаты будут выглядеть совсем иначе:
Все простые числа от 0 до 100:
Не распараллелено: Задача заняла: 110ms
Распараллелено: Задача заняла: 64мс
Все простые числа от 0 до 2000:
Не распараллелено: Задача заняла: 7797ms
Распараллелено: Задача заняла: 25799мс
Поскольку по этому вопросу так мало легко понятных ресурсов, и я, честно говоря, не совсем понимаю, что именно делает мой код,Я очень удивлен, почему он ведет себя так, как он делает.