Parallel processing 为什么基于人造丝的并行处理比串行处理花费更多的时间?

Parallel processing 为什么基于人造丝的并行处理比串行处理花费更多的时间?,parallel-processing,rust,rayon,Parallel Processing,Rust,Rayon,通过学习,我想比较斐波那契级数的并行计算和串行计算的性能。这是我的密码: use rayon; use std::time::Instant; fn main() { let nth = 30; let now = Instant::now(); let fib = fibonacci_serial(nth); println!( "[s] The {}th number in the fibonacci sequence is {}, elap

通过学习,我想比较斐波那契级数的并行计算和串行计算的性能。这是我的密码:

use rayon;
use std::time::Instant;

fn main() {
    let nth = 30;
    let now = Instant::now();
    let fib = fibonacci_serial(nth);
    println!(
        "[s] The {}th number in the fibonacci sequence is {}, elapsed: {}",
        nth,
        fib,
        now.elapsed().as_micros()
    );

    let now = Instant::now();
    let fib = fibonacci_parallel(nth);
    println!(
        "[p] The {}th number in the fibonacci sequence is {}, elapsed: {}",
        nth,
        fib,
        now.elapsed().as_micros()
    );
}

fn fibonacci_parallel(n: u64) -> u64 {
    if n <= 1 {
        return n;
    }

    let (a, b) = rayon::join(|| fibonacci_parallel(n - 2), || fibonacci_parallel(n - 1));
    a + b
}

fn fibonacci_serial(n: u64) -> u64 {
    if n <= 1 {
        return n;
    }

    fibonacci_serial(n - 2) + fibonacci_serial(n - 1)
}

我的串行/并行计算实现可能有缺陷。但是如果没有,为什么我会看到这些结果呢?

我认为真正的原因是,你创建的
线程不好。在每次调用
fibonacci\u parallel
时,您都会为人造丝创建另一对线程,因为您在闭包中再次调用
fibonacci\u parallel
,所以您会创建另一对线程。
这对OS/人造丝来说是非常糟糕的

解决此问题的方法可以是:

fn fibonacci_parallel(n:u64)->u64{ fn内部(n:u64)->u64{ 如果n货物运行——释放20 在0.02秒内完成发布[优化]目标 运行'target/release/foo 20` [s] 斐波那契数列中的第10个数字是6765,经过时间:82 [p] 斐波那契数列中的第10个数字是6765,经过时间:241
如果要进行速度比较,请始终使用
--release
或操场左上角的按钮release(调试下)!这些是内部任务,不是真正的线程,但这里的结果基本相同。并行化开销比收益高。@chpio感谢您的详细说明。请随意回答我的答案,我很乐意接受。@chpio:的确,这是一个开销问题。创建的每个任务都需要计划,发送到线程,等等。我一般来说,并行化只值得粗粒度并行化。
# `s` stands for serial calculation and `p` for parallel
[s] The 30th number in the fibonacci sequence is 832040, elapsed: 12127
[p] The 30th number in the fibonacci sequence is 832040, elapsed: 990379