wasm VS js,谁快?(四)切片及原始指针
回顾
开始新内容前让我们先回忆下之前的内容,之前我们构造了一棵约30万个节点的树,测出来结果 wasm比js慢约4倍,比较反直觉,所以我们拆分成:
我们构造两个向量,用原始指针反复从第一个向量读取数据,然后插入到第二个向量中,用 len 控制读取次数。
注意:
1,由于js没有切片概念,所以在rust侧用不安全的原始指针方法直接读取数据。
2,读取的数据插入到第二个向量尾部,这里也测了向量尾部操作的性能,牵扯到扩容,同样js数组也会动态扩容。
3,切片用到了 将向量按每个元素一个切片去拆,由于切片和原始指针都比js快,这里就不贴切片代码了。
bash
#[wasm_bindgen]
pub fn unsafeSliceFun(len: usize) {
let mut nodeStack: Vec<&mut usize> = vec![];
let mut arr = vec![1; len];
let ptr = arr.as_mut_ptr();
unsafe {
for i in 0..len {
nodeStack.push(&mut *ptr.add(i));
}
}
}
bash
const sliceFun = (len) => {
const nodeStack = [];
const arr = Array(len).fill(1);
for (let i=0; i<len; i++) {
nodeStack.push(arr[i]);
}
}
plain
wasm-slice: 0.5888671875 ms
wasm-unsafe-slice: 0.1650390625 ms
js-slice: 6.85205078125 ms
可以看到 原始指针比js快约41倍,切片比js快约11倍,问题不在这里,继续测试。
欲知后事如何且听下回分解。