public class Fibonacci {
public static class PFibo extends Thread {
private int x;
public long answer;
public PFibo(int x) {
this.x = x;
}
public void run() {
if (x <= 2)
answer = 1;
else {
try {
PFibo t = new PFibo(x - 1);
t.start();
long y = RFibo(x - 2);
t.join();
answer = t.answer + y;
} catch (InterruptedException ex) {
}
}
}
}
public static long RFibo(int no) {
if (no == 1 || no == 2) {
return 1;
}
return RFibo(no - 1) + RFibo(no - 2);
}
public static void main(String[] args) throws Exception {
try {
long start = System.currentTimeMillis();
PFibo f = new PFibo(30);
f.start();
f.join();
long end = System.currentTimeMillis();
System.out.println("Parallel-Fibonacci:" + f.answer + "\tTime:" + (end - start));
start = System.currentTimeMillis();
long result = RFibo(30);
end = System.currentTimeMillis();
System.out.println("Normal-Fibonacci:" + result + "\tTime:" + (end - start));
} catch (Exception e) {
}
}
}私は現在、「アルゴリズム入門」から「マルチスレッドアルゴリズム」を読んでいますマルチスレッドフィボナッチ
。私は、n番目のフィボナッチ数を計算するための基本的なマルチスレッドプログラムを実装しようとしました。 n = 30の場合、プログラムは次の出力を出しました。
Parallel-Fibonacci:832040 Time:10
Normal-Fibonacci:832040 Time:3
なぜパラレルバージョンが非パラレルバージョンより遅いのですか?スレッド切り替えや「スレッド数が多すぎます」が遅くなっていますか?
パラレルバージョンのスピードアップには、どのようなアプローチが必要ですか?
ループごとに新しいスレッドを作成しているようです。それはあなたにかかるだろう。 – Carcigenicate
また、フィボナッチは*シーケンス*なので、マルチスレッドにはそれほど意味がありません。すべての値は前の値に依存します。 –