如何并行扩展集合?

问题描述

我有一个 HashMap,我想尽快向其中添加元素。我尝试使用 par_extend,但实际上最终比串行版本慢。我的猜测是它正在并行评估迭代器,但串行扩展集合。这是我的代码

use std::collections::HashMap;
use rayon::prelude::*;
use time::Instant;

fn main() {
    let n = 1e7 as i64;

    // serial version
    let mut t = Instant::Now();
    let mut m = HashMap::new();
    m.extend((1..n).map(|i| (i,i)));
    println!("Time in serial version: {}",t.elapsed().as_seconds_f64());

    // parallel version - slower
    t = Instant::Now();
    let mut m2 = HashMap::new();
    m2.par_extend((1..n).into_par_iter().map(|i| (i,i)));
    println!("Time in parallel version: {}",t.elapsed().as_seconds_f64());
}

是否有一种更快的方法来扩展实际上并行添加元素的 HashMap?或者类似的可以并行扩展的数据结构?我知道使用 FnvHashMap 之类的东西会运行得更快,但似乎也应该可以通过并行来加快速度。 (是的,我正在使用 --release 进行编译)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)