想将
https://github.com/qiuxiang/aubiojs
库编译成wasm格式文件,然后在小程序内调用。
在小程序内使用
https://developers.weixin.qq.com/miniprogram/dev/framework/performance/wasm.html
方法来引入使用。
但由于对wasm技术不了解,在用WXWebAssembly.instantiate(path, imports)方法引入时,imports需要传参,如果不传的话就报错,报错内容为:
TypeError: WebAssembly.instantiate(): Import #0 module="a" error: module is not an object or function
把a加进去又有新报错LinkError: WebAssembly.instantiate(): Import #0 module="a" function="a" error: function import requires a callable
就说明有一堆参数要盲猜填写。
然后对比着代码库编译生成的js文件(就是wasm配套的js文件),发现需要入参的参数很多,于是我就无从下手了。
我不清楚这些参数是如何产生的,能否在编译wasm文件时就取消这些入参,假若必传的话我该传啥。
WXWebAssembly.instantiate('/utils/aubio.wasm', {
a: {}
}).then(res => {
console.log('WXWebAssembly', res);
const instance = res.instance;
console.log('instance', instance.exports);
instance.exports.then(result => {
console.log('result', result);
})
}).catch(error => {
console.error('error', error);
})
LinkError: WebAssembly.instantiate(): Import #0 module="a" function="a" error: function import requires a callable
因为不懂wasm编译,所以无从下手。
https://github.com/qiuxiang/aubiojs
编译出的wasm文件能够成功在小程序内使用。
使用两个 worker,一个 worker 存储数据,另一个 worker 处理数据。通过这种方式可以终止处理工作者,并且数据将始终保留。每当它启动时,将超过 500MB 的数据复制到 webworker 会花费太多时间。这可以使用SharedArrayBuffer 完成,但由于一些安全问题,它的支持现在非常有限/不存在。
使用Emterpreter和使用emscripten_sleep_with_yield. 在使用 Emterpreter 时会破坏性能(在上面的文档中提到过),并使所有查询速度降低约 4-6 倍。
始终运行第二个工作程序,并且在 UI 中只显示最新的。如果它不是共享数据结构并且数据大小为 500MB x 2 = 1GB(在现代桌面浏览器/计算机中运行时,500MB 似乎是一个大但可接受的大小),则可能会遇到很多 OOM 错误。
使用对服务器的 API 调用来存储状态并检查查询是否被取消。尽管从每个正在运行的查询中每秒对网络请求进行长时间轮询似乎很笨拙。
使用增量解析方法,一次只解析一行。但也需要大量重写解析函数,以便每个函数都支持这一点(实际的数据解析在几个函数中处理——过滤、搜索、计算、分组、排序等。
使用 IndexedDB 并将状态存储在 javascript 中。在 WASM 中分配一块内存,然后将其指针返回给 JavaScript。然后在那里读取数据库并填充指针。然后用 C++ 处理你的数据。
你的链接不是有视频教程么