WebAssembly做科学计算时如何高效传递数组数据?

长孙艳兵 阅读 25

我用Rust编译成WASM来做矩阵运算,但每次传大数组都特别慢,是不是我用法不对?

试过直接传JS的Float64Array过去,结果性能还不如纯JS。查了文档说要用内存共享,但我照着写还是卡在数据拷贝上。

<script type="module">
  import init, { mat_mul } from './pkg/matrix.js';
  async function run() {
    await init();
    const a = new Float64Array([1, 2, 3, 4]);
    const b = new Float64Array([5, 6, 7, 8]);
    const result = mat_mul(a, b); // 这里感觉每次都复制了一遍
    console.log(result);
  }
  run();
</script>
我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
Mc.明月
Mc.明月 Lv1
你得用 WebAssembly.Memory 共享内存,别直接传 Float64Array。在 Rust 里定义共享内存,然后用 Uint8Array 来访问。差不多这样:

const memory = new WebAssembly.Memory({ initial: 20 });
const sharedBuffer = new Uint8Array(memory.buffer);
// 然后在 Rust 里把 matrix 数据放这块共享内存里
// 这样就不用每次复制数据了


Rust 部分也要改,别直接接收 JS 数组,从共享内存读数据。累死我了,但这能快不少。
点赞
2026-03-26 18:01