Я пытаюсь реализовать факториальную функцию с помощью стратегии «разделяй и властвуй». Я использовал инфраструктуру ForkJoin для разветвления каждой рекурсивной задачи, чтобы ускорить вычисления. Но я обнаружил, что это не ускоряется, как я ожидал. Вычисление факториала 50000 без использования ForkJoin заняло 28 секунд, а при использовании ForkJoin — 25 секунд. это код без forkjoin:
public static BigInteger factorial(long p, long q) {
if (q < p) {
return new BigInteger("1");
}
if (p == q) {
return new BigInteger("" + p);
}
BigInteger fact = new BigInteger("1");
fact = fact.multiply(factorial(p, (p + q) / 2)).multiply(factorial((p + q) / 2 + 1, q));
return fact;
}
А это код с forkJoin:
public class Factorial extends RecursiveTask<BigInteger>{
private long p, q;
public Factorial(long p, long q) {
this.p = p;
this.q = q;
}
@Override
public BigInteger compute() {
if(q < p) {
return new BigInteger("1");
}
if( p == q) {
return new BigInteger(""+p);
}
Factorial f1 = new Factorial(p, (p+q)/2);
Factorial f2 = new Factorial((p+q)/2 + 1, q);
f2.fork();
return f1.compute().multiply(f2.join());
}
}
Где я ошибаюсь? Я не думаю, что это будет результатом Fork/Join. Пожалуйста помоги!
new BigInteger("1")
константойBigInteger.ONE
; Заменитеnew BigInteger("" + p)
наBigInteger.valueOf(p)
. Это быстрее и повторно использует ранее созданные экземпляры, где это возможно. - person gb96   schedule 05.12.2012