为什么 JS / React 比 WebAssembly / Rust 快得多?

Why are JS / React much quicker than WebAssembly / Rust?

我正在用 Rust (wasm_bindgen) 生成的 Wasm 做一些测试。令我眼花缭乱的是 JavaScript 实现似乎比 Rust 实现快得多。

程序正在创建 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);

两者都同样“慢”。

我正在导入带有生成的 js 的 Wasm 二进制文件和 wasm-build 附带的 d.ts 文件。

JavaScript 至少是 rust 代码的两倍。为什么是这样?我在实施方面做错了什么吗?实现是根据 MDN 文档设置的。

我已将所有代码放入一个 React 项目中 - https://github.com/Devalo/rust-react-wasm-test

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

我真的很喜欢 this quick read from Winston Chen 他们 运行 比较 Web 程序集和 vanilla JS 的性能测试。

如果您有兴趣进行更深入的对话,this talk by Surma at Google I/O '19 非常有用。来自视频:

Both JavaScript and Web Assembly have the same peak performance. They are equally fast. But it is much easier to stay on the fast path with Web Assembly than it is with JavaScript.