为什么JS/Rect比WebAssembly/Rust快得多



我正在使用Rust生成的Wasm(Wasm_bindgen(进行一些测试。让我眼花缭乱的是,JavaScript实现似乎比Rust实现快得多。

该程序正在创建dict/object/map的n个项,并将其推送到一个数组中。

JavaScript实现非常简单:

const createJSObjects = (amount: number) => {
const arr: Array<{ index: number }> = []
for (let i = 0; i < amount; i++) {
arr.push({
index: i
})
}
return arr
}

很简单。Rust实现类似:

#[wasm_bindgen]
pub fn create_rust_objects(amount: usize) -> JsValue {
let mut arr: Vec<Obj> = vec![];
arr.reserve(amount);
for i in 0..amount {
let itm = Obj { index: i };
arr.push(itm);
}
JsValue::from_serde(&arr).unwrap()
}

我还尝试了一个哈希图向量:

let mut field = HashMap::new();
field.insert("index", i);
arr.push(field);

两者都是相等的";"慢";。

我正在导入Wasm二进制文件以及Wasm构建附带的生成的js和d.ts文件。

JavaScript的速度至少是rust代码的两倍。为什么会这样?我是不是在执行中做错了什么?实现是根据MDN文档设置的。

我把所有的代码都放在了一个React项目中——https://github.com/Devalo/rust-react-wasm-test

答案是您可能没有做错任何事情。从本质上讲,WASM具有更快的潜力,但不会总是更快。

我真的很喜欢Winston Chen的这篇短文,在这篇文章中,他们进行了性能测试,将web程序集与普通JS进行了比较。

如果你对更深入的对话感兴趣,Surma在谷歌I/O’19上的这次演讲内容丰富。来自视频:

JavaScript和Web Assembly都具有相同的峰值性能。它们同样快。但是,使用Web Assembly比使用JavaScript更容易保持快速路径。