ibireme
V2EX  ›  C

写一个最快的 JSON Library

  •  7
     
  •   ibireme · Oct 21, 2020 · 12716 views
    This topic created in 2206 days ago, the information mentioned may be changed or developed.

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

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

    还做 iOS 吗? YYKit 还继续维护吗?
    mathzhaoliang
    mathzhaoliang
    Oct 22, 2020
    45
    大佬能在文章里讲讲代码结构么,我感觉单独看一行还能看懂,连起来就不知道在写什么了。
    polymerdg
    polymerdg
    Oct 22, 2020
    46
    C 大佬
    yangshebing
    yangshebing
    Oct 22, 2020
    47
    很好,很强大
    arnoldxiao
    arnoldxiao
    Oct 22, 2020
    48
    又见大佬出山
    nicebird
    nicebird
    Oct 22, 2020
    49
    很猛的样子,
    BreadBig
    BreadBig
    Oct 22, 2020
    50
    敬仰 大佬
    zjddp
    zjddp
    Oct 22, 2020
    51
    YYKit 大佬!
    huaskaFW
    huaskaFW
    Oct 22, 2020
    52
    给大佬递茶🍵
    ibireme
    ibireme
    OP
    Oct 22, 2020
    53
    @mathzhaoliang 从外面的 json_read 和 json_write 入口看进来就挺清晰了,代码里面是按功能分开的,数据结构可以看这里: https://github.com/ibireme/yyjson/blob/master/doc/DataStructure.md
    ibireme
    ibireme
    OP
    Oct 22, 2020
    54
    @wzzzx 其实用到 C99 的 stdint 和 stdbool,但加一点兼容逻辑就能适配 C89 了。有些编译器比如旧一点的 msvc 是不支持完整 C99 的。
    codyfeng
    codyfeng
    Oct 22, 2020 via Android
    55
    牛啊,膜拜一下
    mathzhaoliang
    mathzhaoliang
    Oct 22, 2020
    56
    @ibireme 那个 md 文档我能看懂,多谢。顺便问下为什么你的项目名字都带个 yy ?
    KeyboardManAnAn
    KeyboardManAnAn
    Oct 22, 2020
    57
    既然是使用的 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
    KeyboardManAnAn
    Oct 22, 2020
    58
    @mathzhaoliang 早期 iOS 开发语言是 Objective-C ,因为没有命名空间,为了防止命名冲突,都会在自定义的类前面加上自己的名字(或者是项目的名字,或者是公司的名字)的缩写前缀, 以作区别. 现在大佬的项目还是加上 yy 前缀(大佬个人名字的汉语拼音缩写), 可能是历史遗留问题, 可能是强迫症使然, 不过更多可能的是品牌策略(🐶🐶🐶)
    KeyboardManAnAn
    KeyboardManAnAn
    Oct 22, 2020
    59
    @TangMonk 大佬的博客中有相关自述, 参见 https://blog.ibireme.com/2017/09/01/diary/#more-42043
    thisisgpy
    thisisgpy
    Oct 22, 2020❤️1
    60
    大老牛逼,但是违反广告法了。
    andyhuzhill
    andyhuzhill
    Oct 22, 2020
    61
    @ibireme #54 话说 msvc 跳过 c99 开始支持 c11 和 c17 了
    nonduality
    nonduality
    Oct 22, 2020
    62
    @KeyboardManAnAn yyjson 是 ANSI C 写的,可移植性强,能适应全平台、多语言,期待 yyjson 站到相当于 sqlite 的地位。前些天大牛 Agentzh 也说写了一个极其高效的 json 库,可惜目前不开源。

    另,继续期待尽早支持 python,因为 rapidjson 是 rust 写的(编译不方便),ultrajson 不支持 musl 库(在 Alpine Linux 用起来别扭) @ibireme
    onevcat
    onevcat
    Oct 22, 2020
    63
    给大佬递茶🍵
    exceldream
    exceldream
    Oct 22, 2020 via Android
    64
    为什么不叫 rocket json
    Guaidaodl
    Guaidaodl
    Oct 22, 2020
    65
    给大佬跪下了.
    KeyboardManAnAn
    KeyboardManAnAn
    Oct 23, 2020 via iPhone
    66
    @onevcat 大佬给大佬递茶🍵🍵🍵
    erpapa
    erpapa
    Oct 26, 2020
    67
    给大佬递茶🍵
    nonduality
    nonduality
    Oct 28, 2020
    68
    对了,以你的 C 代码功力,章亦春很可能会要你,记得他创办的公司允许远程工作,兴许你可以看下他现在招不招人 github.com/agentzh weibo.com/agentzh
    DinoStray
    DinoStray
    Jan 7, 2021
    69
    研究了一下, 觉得不敢用, 个人能力问题, 源码理解实在困难. 而且 C 的 API, 用在 CPP 还是太别扭了.
    sunblackshine
    sunblackshine
    Jun 11, 2021
    70
    我就一个问题,yy 是啥缩写
    Erwinan
    Erwinan
    Sep 9, 2021
    71
    给大佬递茶🍵
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4894 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 128ms · UTC 07:18 · PVG 15:18 · LAX 23:18 · JFK 02:18
    ♥ Do have faith in what you're doing.