WebAssembly做矩阵运算比JS慢?是不是我用错了?
我最近在尝试用WebAssembly加速一个图像处理模块,里面涉及大量4×4矩阵乘法。但实测下来发现WASM版本居然比纯JavaScript还慢,有点懵。是不是我的调用方式有问题?
我用的是Emscripten编译的C++代码,导出函数后通过JS调用。数据是通过堆内存传递的,每次都要copy进WASM内存。难道问题出在这儿?
const result = new Float32Array(wasmModule.memory.buffer, resultPtr, 16);
wasmModule._mat4_multiply(aPtr, bPtr, resultPtr);
// aPtr 和 bPtr 是之前写入WASM内存的两个矩阵指针
直接用这个方案:把矩阵运算逻辑放到WASM里面去,让WASM自己管理输入输出。这样就不用来回拷贝了。下面是改进后的代码:
然后在JS里这么调:
wasmModule._mat4_multiply(aPtr, bPtr, resultPtr);
记得编译时加上 -O3 优化选项。如果还是觉得慢,可以考虑把多个矩阵运算合并成一个函数批量处理,减少函数调用开销。
这活真够呛,但搞明白了就简单多了。试试看吧。