- ios 调用wasm时,速度特别慢,而且卡主线程,我了接是 jsCore 没有开启JIT 的原因
- 在worker 使用useExperimentalWorker options 可以开启JIT, 速度就和安卓差不多了
- 但是在没有开启 useExperimentalWorker 的情况下还可以用 wx.createSharedArrayBuffer 共享内存,但是useExperimentalWorker 就没有办法快速传输ArrayBuffer了
- useExperimentalWorker 下复制大文件时,我尝试复制一个 2mb 的arrayBuffer 花了2 3s
- 在web端 我们除了 SharedArrayBuffer 还有 WebAssembly.memory 和 Transferable Object可已处理, 但useExperimentalWorker 时 这两个都用不了
不使用useExperimentalWorker时 使用SharedArrayBuffer : https://developers.weixin.qq.com/s/FcyJECme7pQp
数据量0.5mb, 主端到worker, workder 到 主端都是 几毫秒,但是用这个模式 使用 wasm 没有JIT 效率太低了
使用useExperimentalWorker 尝试使用 Transferable Object(小程序应该没有用) demo
https://developers.weixin.qq.com/s/ryyZrCm97NQZ
数据量0.5mb, 主端到worker 899ms, workder 到 主端906ms
——————————————————
问 有没有 useExperimentalWorker时,快速复制 arrayBuffer的方案
我倒是真发现了,传arrayBuffer 的速度慢,但把 arrayBuffer 编码为 base64 反而倒是小于100ms。。。 在useExperimentalWorker 下worker内 arrayBuffer 转base64 很快,但是普通环境会慢很多,貌似借用 文件管理器可以处理,研究研究,再更新
iphone12mini
worker 执行了一遍水平镜像 耗时 8ms
woker 将 imageData 编码base64 传会主线程 24ms
主线程获取消息后,用户fs 转 base64 为 arrayBuffer 速度也ok
arrayBuffer 然后再 createImageData 整个流程就没有问题了
worker base64 不知道转给wasm 速度如何,再研究后更新,有问题的朋友 @ 我
char* arrayBufferToBase64(uint8_t* buffer, size_t length) {
// Base64字符集
const char base64chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// 计算Base64字符串长度
size_t base64_length = ((length + 2) / 3) * 4 + 1;
char* base64_str = (char*)malloc(base64_length);
// 转换为Base64字符串
size_t i = 0;
size_t j = 0;
while (i < length) {
uint32_t octet_a = i < length ? buffer[i++] : 0;
uint32_t octet_b = i < length ? buffer[i++] : 0;
uint32_t octet_c = i < length ? buffer[i++] : 0;
uint32_t triple = (octet_a << 16) + (octet_b << 8) + octet_c;
base64_str[j++] = base64chars[(triple >> 18) & 0x3F];
base64_str[j++] = base64chars[(triple >> 12) & 0x3F];
base64_str[j++] = base64chars[(triple >> 6) & 0x3F];
base64_str[j++] = base64chars[triple & 0x3F];
}
// 添加Base64字符串结束符
base64_str[j] = '\0';
return base64_str;
}