我有一段非常简单的 Typescript 代码,可以解析特定的数据格式,输入是 UInt8Array。我已经尽可能地对其进行了优化,但我认为这个相当简单的解析器应该能够比我让它作为 JS 运行得更快。我想尝试使用 AssemblyScript 在 Web 汇编中编写它,以确保我没有遇到任何 Javascript 引擎的怪癖。
正如我现在所知道的,我不能只将 TypedArray 传递给 Wasm 并让它自动工作。据我了解,我可以将指针传递给数组,并且应该能够直接从 Wasm 访问它而无需复制数组。但我不能让它与 AssemblyScript 一起使用。
以下是一个最小示例,显示了我如何无法将 ArrayBuffer 传递给 Wasm。
设置 Wasm 导出的代码主要来自自动生成的样板:
const fs = require("fs");
const compiled = new WebAssembly.Module(
fs.readFileSync(__dirname + "/build/optimized.wasm")
);
const imports = {
env: {
abort(msgPtr, filePtr, line, column) {
throw new Error(`index.ts: abort at [${line}:${column}]`);
}
}
};
Object.defineProperty(module, "exports", {
get: () => new WebAssembly.Instance(compiled, imports).exports
});
下面的代码调用了 WASM,index.js 就是上面的胶水代码。
const m = require("./index.js");
const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
const result = m.parse(data.buffer);
编译成 WASM 的 AssemblyScript 如下:
import "allocator/arena";
export function parse(offset: usize): number {
return load<u8>(offset);
}
当我执行该代码时,我得到一个“RuntimeError:内存访问越界”。
主要问题是我从 Wasm 得到的错误对我自己解决这个问题没有帮助。我显然错过了幕后实际运作的一些主要方面。
如何使用 AssemblyScript 将 TypedArray 或 ArrayBuffer 从 JS 传递到 Wasm?