Fibonacci的异步计算比序列计算慢

时间:2015-01-25 22:40:29

标签: c++ c++11 asynchronous

我正在尝试使用此代码计算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机器上测试它。

2 个答案:

答案 0 :(得分:2)

您正在有效地替换函数调用(在递归版本中)的开销,其中包括启动调用该函数的线程(并在每个线程完成后等待)。很难想象你的多线程代码比递归代码运行得更快的任何场景。

当然,如果你真的关心性能(而不是尝试特别大的n),你可以使用封闭形式来计算Fibonacci序列。与5的平方根有关系.....

答案 1 :(得分:0)

对于Fibonacci序列,每个连续计算依赖于先前结果,因此无法并行化。您所做的只是引入同步开销,导致等待状态。