我正在尝试并行化我的一部分代码,尽管它使用rayon
和并行迭代器par_iter()
and par_extend()
,但它看起来仍然像在单个线程上运行。
我只是创建一个 的向量i32
,用很多值填充它,然后将这些值移动到collections::HashSet
整数中。
我的单线程代码:
use std::collections::HashSet;
fn main() {
let my_vec: Vec<i64> = (0..100_000_000).collect();
let mut my_set: HashSet<i64> = HashSet::new();
let st = std::time::Instant::now();
my_set.extend(
my_vec.iter().map(|x| x*(x+3)/77+44741) // this is supposed to take a while to compute
);
let dur = st.elapsed();
println!("{:?}", dur);
}
运行时间大约8.86 s
是平均水平。这是使用并行迭代器的代码:
extern crate rayon;
use rayon::prelude::*;
use std::collections::HashSet;
fn main() {
let my_vec: Vec<i64> = (0..100_000_000).collect();
let mut my_set: HashSet<i64> = HashSet::new();
let st = std::time::Instant::now();
my_set.par_extend(
my_vec.par_iter().map(|x| x*(x+3)/77+44741) // this is supposed to take a while to compute
);
let dur = st.elapsed();
println!("{:?}", dur);
}
8.62 s
“并行”版本的 平均运行时间几乎相同(
你知道我做错了什么,或者不明白吗?