如何快速将原始元素类型的数组从 javascript 传递给 Rust 中的 wasm?

How to pass an array of primitive element type from javascript to wasm in Rust fast?

请问如何将包含 uint8 元素的数组从 javascript 快速传递给 Rust 中的 wasm?

我在以下位置找到了一种方法:As JsValue

虽然我想知道当所有元素值都是相同的原始类型并且在特定范围内时是否有明显更快的方法。

例如,您将 uint8 数组编码为字符串,然后将字符串传递给 wasm,而不是通过 JsValue。

或者我想知道您是否可以不通过 JsValues 将任何原始元素类型的数组传递给 wasm。

编辑:阅读第一个答案后,我试着按照我的理解来理解答案如下。好像成功了。我的理解正确吗?


import * as wasm from "../pkg";
import * as bg_wasm from '../pkg/PACKAGE_NAME_bg.wasm';
const RUST_STRUCT = wasm.RUST_STRUCT.new();

const cellsPtr = RUST_STRUCT.cells();
const cells = new Uint8Array(bg_wasm.memory.buffer, cellsPtr, 100);
console.log( cells[50]);// 0
for(let i=0;i<100;i++){cells[i]=i;}
console.log( cells[50]);//50
console.log( "end");

Vec::leak

WASM虚拟机有自己的内存地址space,从JS看就是一个大ArrayBuffer,通常命名为wasm.memory。您从 JS 传递到 WASM 的任何值都必须从它自己的变量复制到该内存。

不过有个妙招。如果你从 Rust 端分配一个缓冲区,比如 Vec<u8>,然后以某种方式将它的引用传递给 JS,那么 &mut [u8] 将成为 JS Uint8Array,这实际上是一个直接Rust 内存视图。零复制开销。

你只需要注意不要以破坏任何 Rust 不变量的方式使用来自 JS 的引用,例如将它作为另一个引用传回,这样你就可以得到两个 &mut _ 相同的值.此外,只要 JS 持有引用,你就必须在 Rust 中保持此内存处于活动状态。将 Vec::leak() 调用到您的缓冲区中甚至可能是个好主意,这样它的记忆就会永远存在。