收藏
回答

IOS 开启 useExperimentalWorker 可以开启JIT,但buffer复制慢?

  1. ios 调用wasm时,速度特别慢,而且卡主线程,我了接是 jsCore 没有开启JIT 的原因
  2. 在worker 使用useExperimentalWorker options 可以开启JIT, 速度就和安卓差不多了
  3. 但是在没有开启 useExperimentalWorker 的情况下还可以用 wx.createSharedArrayBuffer 共享内存,但是useExperimentalWorker 就没有办法快速传输ArrayBuffer了
  4. useExperimentalWorker 下复制大文件时,我尝试复制一个 2mb 的arrayBuffer 花了2 3s
  5. 在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的方案





最后一次编辑于  04-21
回答关注问题邀请回答
收藏

1 个回答

  • 文辉
    文辉
    05-18

    我倒是真发现了,传arrayBuffer 的速度慢,但把 arrayBuffer 编码为 base64 反而倒是小于100ms。。。 在useExperimentalWorker 下worker内 arrayBuffer 转base64 很快,但是普通环境会慢很多,貌似借用 文件管理器可以处理,研究研究,再更新

    05-18
    有用
    回复 12
    • 文辉
      文辉
      05-18
      1mb 原图,imageData 大小2.1Mb
      iphone12mini 
      worker 执行了一遍水平镜像 耗时 8ms
      woker 将 imageData 编码base64 传会主线程 24ms
      主线程获取消息后,用户fs 转 base64 为 arrayBuffer 速度也ok
      arrayBuffer 然后再 createImageData 整个流程就没有问题了
      worker base64 不知道转给wasm 速度如何,再研究后更新,有问题的朋友 @ 我
      05-18
      回复
    • 文辉
      文辉
      05-18回复文辉
      fs.writeFile 较慢 7mb 写入耗时 443ms
      05-18
      回复
    • 文辉
      文辉
      05-19回复文辉
      尝试 c 代码 图片转png 速度太慢
      05-19
      回复
    • 文辉
      文辉
      05-19回复文辉
      worker 内的 base64 交给c 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;
      }
      05-19
      回复
    • 文辉
      文辉
      05-19回复文辉
      js arrayBufferTobase64 耗时 344, c 版本 153 2.2483660131倍
      05-19
      回复
    查看更多(7)
登录 后发表内容