爱意满满的作品展示区。
taowen

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

  •  
  •   taowen · Dec 12, 2016 · 19901 views
    This topic created in 3623 days ago, the information mentioned may be changed or developed.

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

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

    Java 版本跑分

    java1

    Go 版本跑分

    go-medium

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

    https://github.com/miloyip/rapidjson
    https://github.com/miloyip/nativejson-benchmark
    slixurd
    slixurd
    Dec 12, 2016❤️1
    11
    我改了一下你的 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
    sfqtsh
    Dec 12, 2016 via Android
    12
    C/C++写的不必你这快 10 倍- O -
    taowen
    taowen
    OP
    Dec 12, 2016
    13
    @zcbenz 如果和 c++比的话,怎样的测试才算公平?
    taowen
    taowen
    OP
    Dec 12, 2016 via Android
    14
    @zcbenz string 是 std 呢还是 fb 呢还是 qstring 呢。性能差别大了去了。
    zcbenz
    zcbenz
    Dec 12, 2016 via iPhone
    15
    @taowen 顾左右而言他。
    taowen
    taowen
    OP
    Dec 12, 2016
    16
    @zcbenz 代码写出来用的。 rapidjson 再快也没办法用来反序列化 java 对象,比较有何意义呢。 java 多了一次堆外缓存到堆内对象的拷贝,肯定比 c++慢啊。 c++可以直接 mmap 成 bytes ,然后直接 cast 成内存对象来用。
    taowen
    taowen
    OP
    Dec 12, 2016
    17
    @slixurd 刚刚改了一下代码,现在支持了。
    ipwx
    ipwx
    Dec 12, 2016
    18
    你这代码不能防御错误的 JSON 文件。现在是硬件过剩而软件复杂度超过任何人能处理的时代,宁可用大部分性能去防御错误输入,也不要假定输入是对的。显式报错永远比静默忽略要重要。
    ipwx
    ipwx
    Dec 12, 2016
    19
    毕竟静默报错可能会把错误累积到系统其他不知道哪里的地方,这时候查错的成本实在是大得惊人。更别说恶意攻击的情况了。
    taowen
    taowen
    OP
    Dec 13, 2016
    20
    @ipwx point taken, thanks. 这个世界还是需要多样性的。虽然所有的现代语言都支持了数组越界检查,但是仍然有人觉得自己需要裸奔。作死是挡不住的。
    kitalphaj
    kitalphaj
    Dec 13, 2016
    21
    能不能写点注释啊。。。
    ragnaroks
    ragnaroks
    Dec 13, 2016
    22
    不如再写个 C#版?现在在用"http://git.oschina.net/fuis/FadeJSON"速度也不错
    wupher
    wupher
    Dec 13, 2016
    23
    Great JOB !

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

    go 版本还没有上代码生成,纯粹只是做了一些指针运算来代替反射。
    bumz
    bumz
    Dec 10, 2021 via iPhone
    34
    jsoniter 域名是不是过期了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2139 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 64ms · UTC 05:14 · PVG 13:14 · LAX 21:14 · JFK 00:14
    ♥ Do have faith in what you're doing.