斐波那契的异步计算比序列计算慢
async calculation of Fibonacci slower than sequence calculation
我正在尝试以下代码来计算斐波那契级数:
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 的平方根有关系.....
对于斐波那契数列,每个连续的计算都依赖于先前的结果,因此无法并行化。 您所做的只是引入导致等待状态的同步开销。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 使用异步/期货并行和并发计算向量的范数
- 在我的CUDA运行时间计划中,CPU和GPU可以异步计算,但不能合作地计算
- 斐波那契的异步计算比序列计算慢
- 在 boost asio 异步服务器中执行计算 taks
- 是更好的同步或异步从boost asio时,有大量的计算和推/弹出线程安全容器