V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuidetmks
V2EX  ›  程序员

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

  •  
  •   liuidetmks · 126 天前 · 2808 次点击
    这是一个创建于 126 天前的主题,其中的信息可能已经有所发展或是发生改变。
    16 条回复    2022-09-30 09:05:32 +08:00
    gimp
        1
    gimp  
       126 天前
    不清楚,要不提个 Issus 问问
    inhzus
        2
    inhzus  
       126 天前
    v8 牛逼?
    warcraft1236
        3
    warcraft1236  
       126 天前
    是不是没用到相应的指令集
    xiangyuecn
        4
    xiangyuecn  
       126 天前
    现代浏览器 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  
       126 天前
    搞错了,AES 是用 crypto.subtle.encrypt 😂 支持 AES-CTR 、AES-CBC 、AES-GCM
    liuidetmks
        6
    liuidetmks  
    OP
       126 天前
    @warcraft1236 应该都是纯软件实现吧
    Wincer
        7
    Wincer  
       126 天前   ❤️ 1
    从对比图里我没看出来 wasm 慢了,明明 wasm 的计算时间比 js 要短,怎么就变成慢了?
    Jwyt
        8
    Jwyt  
       126 天前
    @Wincer 你看 aes 那里阿
    Wincer
        9
    Wincer  
       126 天前
    @Jwyt #8 哦不好意思,是我看漏了
    Al0rid4l
        10
    Al0rid4l  
       125 天前
    总是有人以为 JS 很慢...其实 JS 基本上算是脚本(或者解释型, 按照大部分人的定义来说)里面最快的了
    不过这种对比吧, 你也不知道他具体实现是怎样的, 也许双方抠抠细节都还能有较大提升
    tool2d
        11
    tool2d  
       125 天前
    官方制图是不是搞错了,我用 github 上的测评页面运行了一下,wasm 明显比 js 快了很多。

    des
        12
    des  
       125 天前 via iPhone
    @tool2d 多运行几次试试,是不是还没触发 jit 优化?
    systemcall
        13
    systemcall  
       125 天前
    @inhzus #2
    FireFox 和 V8 有什么关系?
    sutra
        14
    sutra  
       124 天前 via iPhone
    这图不是循环 10 次,wasm 用时更短的意思?
    param
        15
    param  
       124 天前 via Android
    我这后者快点,手机上跑的
    PeterAlfredLee
        16
    PeterAlfredLee  
       124 天前   ❤️ 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 就更欢迎了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   3538 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 09:06 · PVG 17:06 · LAX 01:06 · JFK 04:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.