全世界最快的 JSON 解析器 - 比别的快 10x - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
taowen
V2EX    分享创造

全世界最快的 JSON 解析器 - 比别的快 10x

  •  
  •   taown 2016-12-12 20:18:50 +08:00 18833 次点击
    这是一个创建于 3285 天前的主题,其中的信息可能已经有所发展或是发生改变。

    jsoniter ( json-iterator )是一款快且灵活的 JSON 解析器,同时提供 JavaGo 两个版本

    • Jsoniter 是最快的 JSON 解析器。它最多能比普通的解析器快 10 倍之多,即使在数据绑定的用法下也有同样的性能优势。无耻地献上自己的跑分
    • 非常易于使用的 api ,允许你使用任何风格或者混搭的方式来解析 JSON 。给你前所未有的灵活性。来看看这些 API 们 是不是真的有那么好用吧
    • 独特的 iterator api 能够直接遍历 JSON ,极致性能! 0 内存分配!这样的 iterator 你绝对没有用过

    Java 版本跑分

    java1

    Go 版本跑分

    go-medium

    第 1 条附言    2016-12-12 20:50:34 +08:00
    第 2 条附言    2016-12-13 10:24:47 +08:00
    ,跑分跑错了…… 人生错觉之一
    第 3 条附言    2016-12-14 23:06:37 +08:00
    跑分已经修正
    34 条回复    2021-12-10 13:30:54 +08:00
    majinjing3
        1
    majinjing3  
       2016-12-12 20:28:25 +08:00 via Android
    支持,建议加到 awesome-go 里面哈,
    crytis
        2
    crytis  
       2016-12-12 20:37:02 +08:00 via Android
    矮油,你这测试的,为啥 fastjson 比 jackson 慢?跟阿里的测试不符啊,还有,能差这么多性能?
    taowen
        3
    taowen  
    OP
       2016-12-12 20:38:22 +08:00
    @crytis https://github.com/fabienrenaud/java-json-benchmark 我从这里 fork 的。别人测的也是这个结果。 fastjson 就是不快啊。
    a3mao
        4
    a3mao  
       2016-12-12 20:44:13 +08:00   1
    能否说说是怎么实现的?为啥会这么快?
    taowen
        5
    taowen  
    OP
       2016-12-12 20:50:42 +08:00
    irgil
        6
    irgil  
       2016-12-12 20:56:41 +08:00
    taowen
        7
    taowen  
    OP
       2016-12-12 20:58:52 +08:00
    @irgil 这个是代码生成的。鉴于这么多人反馈,我还是缩进一下吧
    0915240
        8
    0915240  
       2016-12-12 21:05:02 +08:00 via iPhone
    比其他的快这么多吗?
    taowen
        9
    taowen  
    OP
       2016-12-12 21:07:22 +08:00 via Android
    @0915240 自测的结果。欢迎第三方验证。我觉得也有点诡异。
    zcbenz
        10
    zcbenz  
       2016-12-12 21:13:27 +08:00
    和 rapidjson 相比如何?速度的差异有可能是实现不完全,或者测试案例有特例, rapidjson 的作者有一供一套完整的 benchmark 。

    https://github.com/miloyip/rapidjson
    https://github.com/miloyip/nativejson-benchmark
    slixurd
        11
    slixurd  
       2016-12-12 21:32:14 +08:00   1
    我改了一下你的 ComplexObject
    public class ComplexObject {
    --public int field1;
    --public List<List<Integer>> field2;
    --public Any field3;
    }
    然后再解析一下 String json = "{'field1': 100, 'field2': [[1,2],[2]]}".replace('\'', '"');
    GG 了...你的 TypeLiteral 实现有点问题,没法保存这种复杂结构
    fastjson 没有问题
    ComplexObject object = JSON.parseObject(json,new TypeReference<ComplexObject>(){});
    sfqtsh
        12
    sfqtsh  
       2016-12-12 21:44:01 +08:00 via Android
    C/C++写的不必你这快 10 倍- O -
    taowen
        13
    taowen  
    OP
       2016-12-12 22:12:54 +08:00
    @zcbenz 如果和 c++比的话,怎样的测试才算公平?
    taowen
        14
    taowen  
    OP
       2016-12-12 22:20:47 +08:00 via Android
    @zcbenz string 是 std 呢还是 fb 呢还是 qstring 呢。性能差别大了去了。
    zcbenz
        15
    zcbenz  
       2016-12-12 22:37:21 +08:00 via iPhone
    @taowen 顾左右而言他。
    taowen
        16
    taowen  
    OP
       2016-12-12 22:45:05 +08:00
    @zcbenz 代码写出来用的。 rapidjson 再快也没办法用来反序列化 java 对象,比较有何意义呢。 java 多了一次堆外缓存到堆内对象的拷贝,肯定比 c++慢啊。 c++可以直接 mmap 成 bytes ,然后直接 cast 成内存对象来用。
    taowen
        17
    taowen  
    OP
       2016-12-12 23:04:21 +08:00
    @slixurd 刚刚改了一下代码,现在支持了。
    ipwx
        18
    ipwx  
       2016-12-12 23:50:46 +08:00
    你这代码不能防御错误的 JSON 文件。现在是硬件过剩而软件复杂度超过任何人能处理的时代,宁可用大部分性能去防御错误输入,也不要假定输入是对的。显式报错永远比静默忽略要重要。
    ipwx
        19
    ipwx  
       2016-12-12 23:51:34 +08:00
    毕竟静默报错可能会把错误累积到系统其他不知道哪里的地方,这时候查错的成本实在是大得惊人。更别说恶意攻击的情况了。
    taowen
        20
    taowen  
    OP
       2016-12-13 00:01:20 +08:00
    @ipwx point taken, thanks. 这个世界还是需要多样性的。虽然所有的现代语言都支持了数组越界检查,但是仍然有人觉得自己需要裸奔。作死是挡不住的。
    kitalphaj
        21
    kitalphaj  
       2016-12-13 07:52:55 +08:00
    能不能写点注释啊。。。
    ragnaroks
        22
    ragnaroks  
       2016-12-13 08:56:22 +08:00
    不如再写个 C#版?现在在用"http://git.oschina.net/fuis/FadeJSON"速度也不错
    wupher
        23
    wupher  
       2016-12-13 09:18:10 +08:00
    Great JOB !

    有空找个小项目试试看。
    Balthild
        24
    Balthild  
       2016-12-13 13:38:06 +08:00
    先收藏,暂时观望一段时间。
    hemoely
        25
    hemoely  
       2016-12-14 01:58:49 +08:00 via Android
    点赞支持
    q397064399
        26
    q397064399  
       2016-12-14 07:58:25 +08:00
    宁愿要一个功能复杂, JSON 报错 定位的解析器,不要速度
    rockswang
        27
    rockswang  
       2016-12-14 08:49:46 +08:00
    支持!!
    mordecai
        28
    mordecai  
       2016-12-15 22:54:43 +08:00
    Miy4mori
        29
    Miy4mori  
       2016-12-16 00:52:57 +08:00 via Android
    只敢用 jackson 和 gson ,毕竟吃了 fastjson 的亏。
    Jazzylol
        30
    Jazzylol  
       2016-12-16 15:09:02 +08:00
    @Miy4mori 求详细
    Miy4mori
        31
    Miy4mori  
       2016-12-16 21:18:29 +08:00 via Android
    @Jazzylol 知乎搜一搜,吐槽挺多的
    beny
        32
    beny  
       2016-12-19 23:02:05 +08:00
    能不能讲下为啥能够这么快
    taowen
        33
    taowen  
    OP
       2016-12-20 00:00:31 +08:00
    @beny http://jsoniter.com/java-howto.html 刚刚对比了一下 jsoniter 的 java 版本对一个简单对象绑定的几种实现。整段的 decoder 源代码生成贡献最大,其次是避免了中间对象的生成,还有就是避免了 int 等 primitive 类型的装箱拆箱。不仅仅是用字节码生产代替反射那么简单的事情。可以看到 jackson 的 afterburner 加上之后并没有比 jackson 本身快多少。整段生成的 java 源代码使得 hotspot 更好去优化目前看来是主要因素。

    go 版本还没有上代码生成,纯粹只是做了一些指针运算来代替反射。
    bumz
        34
    bumz  
       2021-12-10 13:30:54 +08:00 via iPhone
    jsoniter 域名是不是过期了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     912 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 21:41 PVG 05:41 LAX 13:41 JFK 16:41
    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