斐波那契的异步计算比序列计算慢

async calculation of Fibonacci slower than sequence calculation

本文关键字:计算 异步      更新时间:2023-10-16

我正在尝试以下代码来计算斐波那契级数:

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 机器上测试它。

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

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

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