写一个最快的 JSON Library - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ibireme
V2EX    C

写一个最快的 JSON Library

  •  7
     
  •   ibireme 2020-10-21 11:41:39 +08:00 11650 次点击
    这是一个创建于 1825 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前也写过一些 JSON 解析,但感觉这类东西到处都有也没太大价值。 去年出现了 simdjson,使用 AVX2 和 NEON 来解析 JSON,号称是第一个达到 GB/s 的 JSON 解析库。 于是我就好奇在不使用 SIMD 的情况下 JSON 解析性能究竟能达到什么程度。

    这个是我空闲时写的库,C89 、跨平台,对 JSON 可读可写,符合 RFC 标准: htps://github.com/ibireme/yyjson

    至于性能,在新一些的 x64 上通常比 simdjson 快一点,在旧 x64 和 arm64 上比 simdjson 快很多, 可以吹一下这是目前为止最快的 JSON Library 了,大家可以先猜猜看为什么这么快~

    71 条回复    2021-09-09 15:54:09 +08:00
    gugogo
        1
    gugogo  
       2020-10-21 11:42:50 +08:00
    身体咋样啦
    jzyff
        2
    jzyff  
       2020-10-21 11:45:26 +08:00
    比 RapidJSON 快吗
    felixin
        3
    felixin  
       2020-10-21 11:50:06 +08:00 via Android
    给大佬递茶
    fengjianxinghun
        4
    fengjianxinghun  
       2020-10-21 11:50:23 +08:00
    大佬牛逼!
    ytll21
        5
    ytll21  
       2020-10-21 11:50:32 +08:00
    给大神点个赞
    eudore
        6
    eudore  
       2020-10-21 11:52:02 +08:00
    大佬 6666666
    fengjianxinghun
        7
    fengjianxinghun  
       2020-10-21 11:53:13 +08:00
    编译器 128bit 支持?
    编译器内建 clzll/BitScanReverse 这种?
    ibireme
        8
    ibireme  
    OP
       2020-10-21 11:53:50 +08:00
    @jzyff 读写都快 3-5 倍
    ibireme
        9
    ibireme  
    OP
       2020-10-21 11:56:44 +08:00
    @fengjianxinghun 编译器不支持就没用啊,而且只在处理长浮点数时能快一点,普通 JSON 根本用不到。
    fwee
        10
    fwee  
       2020-10-21 12:10:33 +08:00
    为什么比 SIMD 还要快?
    littlewing
        11
    littlewing  
       2020-10-21 12:51:28 +08:00
    可以分享一下为什么这么快吗?
    ibireme
        12
    ibireme  
    OP
       2020-10-21 14:46:05 +08:00   5
    @fwee @littlewing
    总之就是想办法充分利用 CPU 的指令级并行,优化分支预测、优化未对齐内存访问等等,
    然后想办法让编译器生成更优的指令,以后有空可能会写点文章分享下。
    myqoo
        13
    myqoo  
       2020-10-21 14:50:06 +08:00   1
    要是能熟读 strlen, memcpy 等常用函数的内部实现细节,就可以充分利用硬件特性做优化。当年第一次看时被各种奇技淫巧震惊到。
    beidounanxizi
        14
    beidounanxizi  
       2020-10-21 15:00:56 +08:00
    不相信,发一篇吹牛 PPT 看看呗
    ryan0wang
        15
    ryan0wang  
       2020-10-21 15:16:39 +08:00 via Android
    大佬牛逼
    yazinnnn
        16
    yazinnnn  
       2020-10-21 15:29:19 +08:00
    大佬牛逼!
    neighbads
        17
    neighbads  
       2020-10-21 15:44:20 +08:00
    蹲一个文章分享。。大佬 NB
    nonduality
        18
    nonduality  
       2020-10-21 16:14:56 +08:00
    大神能顺手 port 一个到 python 么?

    ultrajason 在 Alpine Linux 下编译安装不方便,一直想找个高速的 json 库代替 python 内置的。
    FH0
        19
    FH0  
       2020-10-21 16:35:36 +08:00
    star 了,c 语言难以企及的高度。想知道楼主做什么工作。
    raaaaaar
        20
    raaaaaar  
       2020-10-21 17:08:57 +08:00 via Android
    beyondex
        21
    beyondex  
       2020-10-21 17:28:34 +08:00
    大佬,牛逼了
    shuax
        22
    shuax  
       2020-10-21 17:31:15 +08:00
    给大佬递茶
    yuanbo6
      &nbp; 23
    yuanbo6  
       2020-10-21 17:36:02 +08:00
    大佬牛逼
    youla
        24
    youla  
       2020-10-21 17:40:19 +08:00
    请问我的.net core 有机会用上吗?
    youla
        25
    youla  
       2020-10-21 17:41:04 +08:00
    等一个 yyjsonSharp
    knightdf
        26
    knightdf  
       2020-10-21 17:57:35 +08:00
    @nonduality ujson
    zhangdasen
        27
    zhangdasen  
       2020-10-21 18:08:19 +08:00
    变态
    youxiachai
        28
    youxiachai  
       2020-10-21 18:31:21 +08:00
    忽然发现..这是 YY 系列组件大神...看来是病好了?
    ydatong
        29
    ydatong  
       2020-10-21 18:37:54 +08:00 via iPhone
    膜拜 yykit 大佬
    perfy576
        30
    perfy576  
       2020-10-21 19:47:05 +08:00
    @myqoo 有这方面的文章吗
    BoarBoar
        31
    BoarBoar  
       2020-10-21 19:50:02 +08:00
    身为同行感觉我们玩的不是一个游戏
    ibireme
        32
    ibireme  
    OP
       2020-10-21 19:59:32 +08:00
    @youxiachai 病没好,不如说更瘦了。。
    @nonduality @youla 库本身还有待完善呢,port 到其他语言先缓缓吧~
    TangMonk
        33
    TangMonk  
       2020-10-21 20:08:54 +08:00 via iPhone
    @ibireme 大神是什么病,能帮上忙吗?
    justin2018
        34
    justin2018  
       2020-10-21 21:11:56 +08:00
    YY 大佬~
    Jasio
        35
    Jasio  
       2020-10-21 21:28:00 +08:00
    给大佬递茶
    inframe
        36
    inframe  
       2020-10-21 21:36:18 +08:00
    给大佬递茶
    refine
        37
    refine  
       2020-10-21 21:50:10 +08:00
    给大佬倒波波茶
    Raven316
        38
    Raven316  
       2020-10-21 22:27:26 +08:00
    给大佬递茶
    whypool
        39
    whypool  
       2020-10-21 22:52:41 +08:00
    给大佬递茶
    loveuqian
        40
    loveuqian  
       2020-10-21 22:56:42 +08:00
    这是 YY 吧?膜拜一下
    wzzzx
        41
    wzzzx  
       2020-10-21 23:02:16 +08:00
    弱弱问一句,为什么使用 C89,不使用 C99 ?
    creanme
        42
    creanme  
       2020-10-21 23:02:38 +08:00
    给大佬递茶
    IvanLi127
        43
    IvanLi127  
       2020-10-22 00:09:18 +08:00 via Android
    给大佬递枸杞茶
    lisonfan
        44
    lisonfan  
       2020-10-22 00:27:17 +08:00 via iPhone
    给大佬端一杯卡布奇诺

    还做 iOS 吗? YYKit 还继续维护吗?
    mathzhaoliang
        45
    mathzhaoliang  
       2020-10-22 08:10:03 +08:00
    大佬能在文章里讲讲代码结构么,我感觉单独看一行还能看懂,连起来就不知道在写什么了。
    polymerdg
        46
    polymerdg  
       2020-10-22 08:35:54 +08:00
    C 大佬
    yangshebing
        47
    yangshebing  
       2020-10-22 09:28:48 +08:00
    很好,很强大
    arnoldxiao
        48
    arnoldxiao  
       2020-10-22 09:59:51 +08:00
    又见大佬出山
    nicebird
        49
    nicebird  
       2020-10-22 10:20:08 +08:00
    很猛的样子,
    BreadBig
        50
    BreadBig  
       2020-10-22 10:30:38 +08:00
    敬仰 大佬
    zjddp
        51
    zjddp  
       2020-10-22 10:39:42 +08:00
    YYKit 大佬!
    arthasliu
        52
    arthasliu  
       2020-10-22 11:52:11 +08:00
    给大佬递茶
    ibireme
        53
    ibireme  
    OP
       2020-10-22 13:19:10 +08:00
    @mathzhaoliang 从外面的 json_read 和 json_write 入口看进来就挺清晰了,代码里面是按功能分开的,数据结构可以看这里: https://github.com/ibireme/yyjson/blob/master/doc/DataStructure.md
    ibireme
        54
    ibireme  
    OP
       2020-10-22 13:22:21 +08:00
    @wzzzx 其实用到 C99 的 stdint 和 stbool,但加一点兼容逻辑就能适配 C89 了。有些编译器比如旧一点的 msvc 是不支持完整 C99 的。
    codyfeng
        55
    codyfeng  
       2020-10-22 13:38:36 +08:00 via Android
    牛啊,膜拜一下
    mathzhaoliang
        56
    mathzhaoliang  
       2020-10-22 13:48:23 +08:00
    @ibireme 那个 md 文档我能看懂,多谢。顺便问下为什么你的项目名字都带个 yy ?
    KeyboardManAnAn
        57
    KeyboardManAnAn  
       2020-10-22 16:29:06 +08:00
    既然是使用的 C 语言编写的,那理论上岂不是几乎可以嵌入到任意语言和平台?

    yyjson-Objective-C for iOS
    yyjson-Swift for iOS
    yyjson-Java for Android
    yyjson-Kotlin for Android
    yyjson-C# for Xamarin
    yyjson-dart for flutter

    也是时候排上日程表了 (滑鸡
    KeyboardManAnAn
        58
    KeyboardManAnAn  
       2020-10-22 16:36:27 +08:00
    @mathzhaoliang 早期 iOS 开发语言是 Objective-C ,因为没有命名空间,为了防止命名冲突,都会在自定义的类前面加上自己的名字(或者是项目的名字,或者是公司的名字)的缩写前缀, 以作区别. 现在大佬的项目还是加上 yy 前缀(大佬个人名字的汉语拼音缩写), 可能是历史遗留问题, 可能是强迫症使然, 不过更多可能的是品牌策略()
    KeyboardManAnAn
        59
    KeyboardManAnAn  
       2020-10-22 16:40:28 +08:00
    @TangMonk 大佬的博客中有相关自述, 参见 https://blog.ibireme.com/2017/09/01/diary/#more-42043
    thisisgpy
        60
    thisisgpy  
       2020-10-22 17:55:29 +08:00   1
    大老牛逼,但是违反广告法了。
    andyhuzhill
        61
    andyhuzhill  
       2020-10-22 18:05:50 +08:00
    @ibireme #54 话说 msvc 跳过 c99 开始支持 11 和 c17 了
    nonduality
        62
    nonduality  
       2020-10-22 20:46:55 +08:00
    @KeyboardManAnAn yyjson 是 ANSI C 写的,可移植性强,能适应全平台、多语言,期待 yyjson 站到相当于 sqlite 的地位。前些天大牛 Agentzh 也说写了一个极其高效的 json 库,可惜目前不开源。

    另,继续期待尽早支持 python,因为 rapidjson 是 rust 写的(编译不方便),ultrajson 不支持 musl 库(在 Alpine Linux 用起来别扭) @ibireme
    onevcat
        63
    onevcat  
       2020-10-22 21:08:08 +08:00
    给大佬递茶
    exceldream
        64
    exceldream  
       2020-10-22 21:11:33 +08:00 via Android
    为什么不叫 rocket json
    Guaidaodl
        65
    Guaidaodl  
       2020-10-22 21:14:12 +08:00
    给大佬跪下了.
    KeyboardManAnAn
        66
    KeyboardManAnAn  
       2020-10-23 08:01:42 +08:00 via iPhone
    @onevcat 大佬给大佬递茶
    erpapa
        67
    erpapa  
       2020-10-26 19:40:25 +08:00
    给大佬递茶
    nonduality
        68
    nonduality  
       2020-10-28 12:07:30 +08:00
    对了,以你的 C 代码功力,章亦春很可能会要你,记得他创办的公司允许远程工作,兴许你可以看下他现在招不招人 github.com/agentzh weibo.com/agentzh
    DinoStray
        69
    DinoStray  
       2021-01-07 17:54:09 +08:00
    研究了一下, 觉得不敢用, 个人能力问题, 源码理解实在困难. 而且 C 的 API, 用在 CPP 还是太别扭了.
    sunblackshine
        70
    sunblackshine  
       2021-06-11 10:58:20 +08:00
    我就一个问题,yy 是啥缩写
    Erwinan
        71
    Erwinan  
       2021-09-09 15:54:09 +08:00
    给大佬递茶
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5875 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 08:34 PVG 16:34 LAX 01:34 JFK 04:34
    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