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

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

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

    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   ·   实用小工具   ·   2750 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 14:55 · PVG 22:55 · LAX 06:55 · JFK 09:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.