我想在 Rust 中试验并行性,特别是 - 比较map
标准库中的串行和rayon中的并行map
。这是基准代码:
#![feature(test)]
extern crate test;
extern crate rand;
extern crate rayon;
#[cfg(test)]
mod tests {
use rayon::prelude::*;
use test::Bencher;
#[bench]
fn iter_test(b: &mut Bencher) {
let vec: Vec<i64> = (0..20000).collect();
b.iter(|| -> i64 {
vec.iter().map(|x| x * x).sum()
});
}
#[bench]
fn par_iter_test(b: &mut Bencher) {
let vec: Vec<i64> = (0..20000).collect();
b.iter(|| -> i64 {
vec.par_iter().map(|x| x * x).sum()
});
}
}
结果:
running 2 tests
test tests::iter_test ... bench: 8,061 ns/iter (+/- 2,606)
test tests::par_iter_test ... bench: 1,915,544 ns/iter (+/- 40,786,648)
为什么并行map
这么慢?当然,我知道有些资源花在了并行化上,但没那么多。map
编译器能以某种方式优化吗?那么如何编写一个基准,在这个基准上可以感受到并行的优势map
?
PS 我试着传递一个map
递归阶乘——结果差别不大,但顺序map
的还是更快。