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

写一个最快的 JSON Library

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

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

    这个是我空闲时写的库,C89 、跨平台,对 JSON 可读可写,符合 RFC 标准: https://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
        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 和 stdbool,但加一点兼容逻辑就能适配 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 开始支持 c11 和 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   ·   实用小工具   ·   925 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:12 · PVG 05:12 · LAX 13:12 · JFK 16:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.