【问题标题】:Why are JS / React much quicker than WebAssembly / Rust?为什么 JS / React 比 WebAssembly / Rust 快得多?
【发布时间】:2021-12-06 18:14:01
【问题描述】:

我正在使用 Rust (wasm_bindgen) 生成的 Wasm 进行一些测试。让我眼花缭乱的是,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-build 附带的生成的 js 和 d.ts 文件导入 Wasm 二进制文件。

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

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

【问题讨论】:

  • 只是好奇,你在没有JsValue::from_serde(&amp;arr).unwrap()的情况下测试过速度吗?
  • 这是个好主意。我没有,因为我一直在努力将 rust 类型返回到 javascript。我在 rust-wasm 书中找到了 serde 的东西。
  • 请告诉我们您是如何测量速度的。对于这样一个简单的函数,serde 开销可能比创建对象的代码本身还要高。
  • 速度是用 javascript 的性能 api 来衡量的。 (performance.now()) 我一直在想同样的事情,并且由于 V8 引擎可能是它所期望的极其优化的东西(比如递增循环),我尝试测量一些加密和区块链操作,看看这是否会产生影响

标签: javascript reactjs rust webassembly


【解决方案1】:

答案是您很可能没有做错任何事。本质上,WASM 有潜力更快,但并不总是更快。

我真的很喜欢 this quick read from Winston Chen,他们在其中运行性能测试,将 Web 程序集与原版 JS 进行比较。

如果您对更深入的对话感兴趣,this talk by Surma at Google I/O '19 会提供非常丰富的信息。来自视频:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-30
    • 2014-04-21
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2011-11-30
    相关资源
    最近更新 更多