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