我正在尝试使用此代码计算Fibonacci系列:
unsigned long fib_async(unsigned long n) {
if (n<2) {
return n;
}
else {
auto res1 = async(fib_async, n-1);
auto res2 = async(fib_async, n-2);
return res1.get() + res2.get();
}
}
为什么这段代码比经典代码慢?
unsigned long fib(unsigned long n) {
return n<2 ? n : fib(n-2) + fib(n-1);
}
n = 40的同步版本在我的8核i7 CPU上持续0.7秒。 n = 40的异步示例持续时间超过1分钟,它似乎仅在一个CPU内核上运行。
我做错了什么?我正在使用gcc 4.8.4的Linux机器上测试它。
答案 0 :(得分:2)
您正在有效地替换函数调用(在递归版本中)的开销,其中包括启动调用该函数的线程(并在每个线程完成后等待)。很难想象你的多线程代码比递归代码运行得更快的任何场景。
当然,如果你真的关心性能(而不是尝试特别大的n),你可以使用封闭形式来计算Fibonacci序列。与5的平方根有关系.....
答案 1 :(得分:0)
对于Fibonacci序列,每个连续计算依赖于先前结果,因此无法并行化。您所做的只是引入同步开销,导致等待状态。