V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
zjcqoo
V2EX  ›  分享创造

目前最快的 js 版 scrypt 算法

  •  
  •   zjcqoo · 2017-02-28 20:50:21 +08:00 · 4508 次点击
    这是一个创建于 2824 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近鼓捣的一个项目,移植了个浏览器版的 scrypt 算法: https://github.com/EtherDream/WebScrypt

    由于 scrypt 对性能要求很高,所以做了各种优化。

    先是用 emscripten 编译成 asm.js ,不过速度还是不够理想,比 native 慢太多了。

    于是用浏览器的 profiles 找出最 heavy 的代码,发现 blockmix 和 salsa8 函数消耗了一大半计算,重点优化。

    这里用了最笨的办法,在 C 代码上把循环和数组都手动展开,比如 int X[16] 的数组拆成 int X0, X1 ..., X15(其实完全可以用 clang 实现,不过暂时没找到选项,反正手动也很简单)。

    这么一折腾 Chrome 上性能提升近 2 倍!

    最后优化体积,毕竟 emscripten 编译出来的 js 有上万行。于是写了个小脚本( src/mod_asmjs/c-bind/reduce.js ),把最核心的逻辑提取出来,包括内存初始化数据。

    这样体积从大几百 K 降到小几十 K 。

    还有就是 scrypt 支持并发维度(参数 P ),所以这里用 Worker 来实现。如果 P > 1 ,这个脚本可甩现有的 js 版 scrypt 好多倍- -

    另外为了提升体验,加了进度回调和终止的功能。不过加上这个之后,性能下降了 10% 左右。

    因为原先的计算过程是完整的,现在被切分成了好几块,中间有些调度开销。(终止功能 没有用 Worker 的 terminate 方法,因为那样 Worker 就废了,下次用还得重新创建。所以是在小块任务调度时停止的)

    大家看看还有什么地方可以优化的,可以讨论下~
    11 条回复    2017-03-08 10:32:13 +08:00
    est
        1
    est  
       2017-02-28 21:04:27 +08:00
    @zjcqoo LZ 就是 etherdream 呀。
    123s
        2
    123s  
       2017-02-28 21:35:01 +08:00
    厉害
    ywt474000158
        3
    ywt474000158  
       2017-02-28 21:52:01 +08:00
    很强势
    zjcqoo
        4
    zjcqoo  
    OP
       2017-02-28 21:58:17 +08:00
    @est 哈哈是啊😀
    DesignerSkyline
        5
    DesignerSkyline  
       2017-02-28 22:18:18 +08:00
    可以,思路很不错
    mywaiting
        6
    mywaiting  
       2017-03-01 00:15:49 +08:00
    一直有关注 这三胖头像的博主, XSS 系列很给力~
    Canrz
        7
    Canrz  
       2017-03-01 11:47:42 +08:00
    囧, etherdream ,想起了以前博客园那篇猥琐风骚的网线攻击
    peneazy
        8
    peneazy  
       2017-03-01 12:45:18 +08:00
    看着很牛逼的样子
    lwbjing
        9
    lwbjing  
       2017-03-01 22:12:39 +08:00
    厉害了我的哥。。
    g0thic
        10
    g0thic  
       2017-03-01 23:16:15 +08:00
    牛逼
    strwei
        11
    strwei  
       2017-03-08 10:32:13 +08:00
    这头像记得很久以前我也用过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2800 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 08:35 · PVG 16:35 · LAX 00:35 · JFK 03:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.