风起提示:由于技术的发展风起云涌,需留意文章时效,2023-06-28。
回顾
开始新内容前让我们先回忆下之前的内容,之前我们构造了一棵约30万个节点的树,测出来结果 wasm比js慢约4倍,比较反直觉,所以我们拆分成:循环、对象深拷贝、向量切片、数学函数、向量的插入和删除,对这几部分分别测试,看看到底哪里慢了。
我们已经测试了循环、深拷贝,对比结果是 wasm快。这篇内容我们测试下向量的切片及原始指针,和js对比看谁快。
构造原始指针
我们构造两个向量,用原始指针反复从第一个向量读取数据,然后插入到第二个向量中,用 len 控制读取次数。
注意:
1,由于js没有切片概念,所以在rust侧用不安全的原始指针方法直接读取数据。
2,读取的数据插入到第二个向量尾部,这里也测了向量尾部操作的性能,牵扯到扩容,同样js数组也会动态扩容。
3,切片用到了 chunks_mut(1) 将向量按每个元素一个切片去拆,由于切片和原始指针都比js快,这里就不贴切片代码了。
rust代码
#[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));
}
}
}
js代码
const sliceFun = (len) => {
const nodeStack = [];
const arr = Array(len).fill(1);
for (let i=0; i<len; i++) {
nodeStack.push(arr[i]);
}
}
结论
将 len=20000 传入执行,执行结果
wasm-slice: 0.5888671875 ms
wasm-unsafe-slice: 0.1650390625 ms
js-slice: 6.85205078125 ms
可以看到 原始指针比js快约41倍,切片比js快约11倍, 问题不在这里,继续测试。
欲知后事如何且听下回分解。
更多精彩内容可关注风起的博客,微信公众号:听风说图