目前最快的 js 版 scrypt 算法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
zjcqoo
V2EX    分享创造

目前最快的 js 版 scrypt 算法

  •  
  •   zjcqoo 2017-02-28 20:50:21 +0800 4928 次点击
    这是一个创建于 3151 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近鼓捣的一个项目,移植了个浏览器版的 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     Solana     5461 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 07:57 PVG 15:57 LAX 00:57 JFK 03:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86