• 请不要在回答技术问题时复制粘贴 AI 生成的内容
liuidetmks
V2EX  ›  程序员

为什么浏览器上 wasm 的 AES 实现比 js 慢?

  •  
  •   liuidetmks · Sep 28, 2022 · 4792 views
    This topic created in 1352 days ago, the information mentioned may be changed or developed.
    16 replies    2022-09-30 09:05:32 +08:00
    gimp
        1
    gimp  
       Sep 28, 2022
    不清楚,要不提个 Issus 问问
    inhzus
        2
    inhzus  
       Sep 28, 2022
    v8 牛逼?
    daiqiangbudainiu
        3
    daiqiangbudainiu  
       Sep 28, 2022
    是不是没用到相应的指令集
    xiangyuecn
        4
    xiangyuecn  
       Sep 28, 2022
    现代浏览器 buffer 加持:

    Array.from(new Uint8Array(

    await crypto.subtle.digest('SHA-1', new Uint8Array(unescape(encodeURIComponent("牛逼")).split("").map(b=>b.charCodeAt(0))))

    )).map(b=>('0'+b.toString(16)).substr(-2)).join('')
    xiangyuecn
        5
    xiangyuecn  
       Sep 28, 2022
    搞错了,AES 是用 crypto.subtle.encrypt 😂 支持 AES-CTR 、AES-CBC 、AES-GCM
    liuidetmks
        6
    liuidetmks  
    OP
       Sep 28, 2022
    @warcraft1236 应该都是纯软件实现吧
    Wincer
        7
    Wincer  
       Sep 28, 2022   ❤️ 1
    从对比图里我没看出来 wasm 慢了,明明 wasm 的计算时间比 js 要短,怎么就变成慢了?
    Dockerfile
        8
    Dockerfile  
       Sep 28, 2022
    @Wincer 你看 aes 那里阿
    Wincer
        9
    Wincer  
       Sep 28, 2022
    @Jwyt #8 哦不好意思,是我看漏了
    Al0rid4l
        10
    Al0rid4l  
       Sep 28, 2022
    总是有人以为 JS 很慢...其实 JS 基本上算是脚本(或者解释型, 按照大部分人的定义来说)里面最快的了
    不过这种对比吧, 你也不知道他具体实现是怎样的, 也许双方抠抠细节都还能有较大提升
    tool2d
        11
    tool2d  
       Sep 28, 2022
    官方制图是不是搞错了,我用 github 上的测评页面运行了一下,wasm 明显比 js 快了很多。

    des
        12
    des  
       Sep 28, 2022 via iPhone
    @tool2d 多运行几次试试,是不是还没触发 jit 优化?
    systemcall
        13
    systemcall  
       Sep 28, 2022
    @inhzus #2
    FireFox 和 V8 有什么关系?
    sutra
        14
    sutra  
       Sep 29, 2022 via iPhone
    这图不是循环 10 次,wasm 用时更短的意思?
    param
        15
    param  
       Sep 30, 2022 via Android
    我这后者快点,手机上跑的
    PeterAlfredLee
        16
    PeterAlfredLee  
       Sep 30, 2022   ❤️ 1
    想不到看到了在 V2EX 上看到了自己的东西 :)

    这个 benchmark 出来结果后,我们也内部讨论过(甚至对 aes 有针对性优化,但是效果不明显),跟大家的看法差不多:
    1 、js+V8 没那么拉垮,JIT 应该还是很明显的
    2 、aes 的计算量不大(从运行时间也能看的出来),在这种情况下,wasm 由于内存拷贝(胶水代码所负责)所附带的性能影响较明显

    由于相关调试工具的缺失,这块没有深究下去,大家有兴趣也可以讨论下

    另外,在测试中还发现了一些有意思的地方:chrome 在开启 performance record 后,性能表现较好,结果也比较稳定,猜测是 chrome 在 performance record 时会对内存及时进行清理。

    @tool2d @des 我们的 benchmark 是有 warm-up 的,已经考虑了 jit 等优化,benchmark 代码开源在 github ;列出的测试结果是在一般的硬件条件下获得的,大家硬件不同,不过一般来说都会比我们所列的测试结果要好


    最后,虽然有点王婆卖瓜的不好意思,但是还是介绍一下 crypto-js-wasm:相比于原来的 crypto-js ,除了引入 wasm 外,还用 ES 进行了重写、加入了 rollup 打包和 jest 测试,还增加了 ts 的支持。后续还考虑增加更多算法(对标 openssl)、加入 simd 、适配其他 runtime(比如 RN)

    希望大家可以尝试用用 crypto-js-wasm ,当然 issue 、pr 就更欢迎了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   982 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 19:27 · PVG 03:27 · LAX 12:27 · JFK 15:27
    ♥ Do have faith in what you're doing.