在向量中使用具有 200k 数据的 Webassembly 时,Rust 函数响应非常慢

Rust function response is very slow when working with Webassembly with 200k data in vector

当我使用数组中的 200k 数据列表从 JavaScript 调用 Rust 函数时,它冻结了应用程序。根据我的调试,问题出在 IF CONDITION(如果 time_value.contains(&value) == false)。当我删除此条件时,响应非常快。但是我需要这个条件。

#[wasm_bindgen]
pub fn channel_duplicate_timestamp(value: &JsValue) -> JsValue {
    panic::set_hook(Box::new(console_error_panic_hook::hook));
    let request: ChanDup = value.into_serde().unwrap();
    let mut time_value = Vec::new();
    let mut time_index: Vec<i32> = Vec::new();
    for (index, value) in request.time_list.into_iter().enumerate() {
        if time_value.contains(&value) == false {
            time_value.push(value);
            time_index.push(index as i32);
        }
    }
    let response = ChanDupRes {
        time_list: time_value,
        t_index:time_index
    };

    JsValue::from_serde(&response).unwrap()
}

}

我试图通过使用另一个函数来完成它,但由于我是 Rust 的新手,所以我失败了。我想从列表中获取重复项的索引

不要让 time_valuetime_index 成为平行向量,您应该在主循环中使用单个 HashMap<&JsValue, i32>,并且只在构建结果时转换为向量。像这样的东西(未经测试):

#[wasm_bindgen]
pub fn channel_duplicate_timestamp(value: &JsValue) -> JsValue {
    panic::set_hook(Box::new(console_error_panic_hook::hook));
    let request: ChanDup = value.into_serde().unwrap();
    let mut time = HashMap::new();
    for (index, value) in request.time_list.into_iter().enumerate() {
        time.entry (&value).or_insert (index as u32);
    }
    let mut time_value = Vec::new();
    let mut time_index = Vec::new();
    for (v, i) in time {
        time_value.push (v);
        time.index.push (i);
    }
    let response = ChanDupRes {
        time_list: time_value,
        t_index:time_index
    };

    JsValue::from_serde(&response).unwrap()
}

请注意,这将以随机顺序输出时间。如果您需要按顺序排列,可以按 index 排序。