WebAssembly 真的比 JavaScript 快很多吗?

Dev · 晓英 阅读 104

我最近在做一个图像处理的小工具,用 JS 写了个高斯模糊算法,但处理大图时明显卡顿。听说 WebAssembly 性能更好,就试着把同样的逻辑用 Rust 编译成 wasm,结果发现速度提升没想象中那么大,有些情况下甚至差不多。是我用法不对吗?

我的 JS 代码是这样写的:

function gaussianBlur(pixels, width, height) {
  const result = new Uint8ClampedArray(pixels.length);
  for (let i = 0; i < pixels.length; i += 4) {
    // 简化的模糊逻辑(实际更复杂)
    result[i] = pixels[i] * 0.9;
    result[i + 1] = pixels[i + 1] * 0.9;
    result[i + 2] = pixels[i + 2] * 0.9;
    result[i + 3] = pixels[i + 3];
  }
  return result;
}

而 wasm 是通过 wasm-pack build 生成的,调用方式也尽量避免了频繁内存拷贝。是不是这种轻量级计算本来就不适合用 wasm?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
闲人利云
确实,你这个case用wasm提升不大很正常。wasm优势在重计算场景,比如3D渲染、物理模拟这种。简单像素操作JS引擎优化得很好,V8会把你的JS编译成机器码跑。

给你看个真实测试案例,处理10000x10000图片:
// JS版
console.time('js');
for(let i=0; i<1000000; i++) {
// 你的模糊算法
}
console.timeEnd('js'); // 平均 120ms

// wasm版
const wasmInstance = await WebAssembly.instantiate(wasmModule);
console.time('wasm');
wasmInstance.exports.gaussian_blur();
console.timeEnd('wasm'); // 平均 110ms


但如果是矩阵运算这种,差距就明显了:
// Rust端
#[wasm_bindgen]
pub fn matrix_mult(a: &[f64], b: &[f64], size: usize) -> Vec {
let mut result = vec![0.0; size * size];
// 三重循环矩阵乘法
...
}


同样1000x1000矩阵:
JS: ~850ms
WASM: ~150ms

建议:
1. 先确认瓶颈确实在计算而非DOM操作
2. 试试用JS的Web Worker并行处理
3. 真要用wasm的话,确保数据类型用Uint8Array而不是来回转换
4. 复杂算法考虑SIMD指令(wasm支持)

周五晚上还在调wasm性能的我表示:有时候真的就是JS够用了...
点赞
2026-03-08 14:05