之前也写过一些 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 了,大家可以先猜猜看为什么这么快~
![]() | 1 gugogo 2020-10-21 11:42:50 +08:00 身体咋样啦 |
2 jzyff 2020-10-21 11:45:26 +08:00 比 RapidJSON 快吗 |
3 felixin 2020-10-21 11:50:06 +08:00 via Android 给大佬递茶 |
4 fengjianxinghun 2020-10-21 11:50:23 +08:00 大佬牛逼! |
5 ytll21 2020-10-21 11:50:32 +08:00 给大神点个赞 |
![]() | 6 eudore 2020-10-21 11:52:02 +08:00 大佬 6666666 |
7 fengjianxinghun 2020-10-21 11:53:13 +08:00 编译器 128bit 支持? 编译器内建 clzll/BitScanReverse 这种? |
9 ibireme OP @fengjianxinghun 编译器不支持就没用啊,而且只在处理长浮点数时能快一点,普通 JSON 根本用不到。 |
10 fwee 2020-10-21 12:10:33 +08:00 为什么比 SIMD 还要快? |
11 littlewing 2020-10-21 12:51:28 +08:00 可以分享一下为什么这么快吗? |
12 ibireme OP ![]() |
![]() | 13 myqoo 2020-10-21 14:50:06 +08:00 ![]() 要是能熟读 strlen, memcpy 等常用函数的内部实现细节,就可以充分利用硬件特性做优化。当年第一次看时被各种奇技淫巧震惊到。 |
![]() | 14 beidounanxizi 2020-10-21 15:00:56 +08:00 不相信,发一篇吹牛 PPT 看看呗 |
15 ryan0wang 2020-10-21 15:16:39 +08:00 via Android 大佬牛逼 |
16 yazinnnn 2020-10-21 15:29:19 +08:00 大佬牛逼! |
![]() | 17 neighbads 2020-10-21 15:44:20 +08:00 蹲一个文章分享。。大佬 NB |
![]() | 18 nonduality 2020-10-21 16:14:56 +08:00 大神能顺手 port 一个到 python 么? ultrajason 在 Alpine Linux 下编译安装不方便,一直想找个高速的 json 库代替 python 内置的。 |
19 FH0 2020-10-21 16:35:36 +08:00 star 了,c 语言难以企及的高度。想知道楼主做什么工作。 |
![]() | 20 raaaaaar 2020-10-21 17:08:57 +08:00 via Android 强 |
21 beyondex 2020-10-21 17:28:34 +08:00 大佬,牛逼了 |
![]() | 22 shuax 2020-10-21 17:31:15 +08:00 给大佬递茶 |
&nbp; 23 yuanbo6 2020-10-21 17:36:02 +08:00 大佬牛逼 |
![]() | 25 youla 2020-10-21 17:41:04 +08:00 等一个 yyjsonSharp |
![]() | 26 knightdf 2020-10-21 17:57:35 +08:00 @nonduality ujson |
27 zhangdasen 2020-10-21 18:08:19 +08:00 变态 |
28 youxiachai 2020-10-21 18:31:21 +08:00 忽然发现..这是 YY 系列组件大神...看来是病好了? |
![]() | 29 ydatong 2020-10-21 18:37:54 +08:00 via iPhone 膜拜 yykit 大佬 |
31 BoarBoar 2020-10-21 19:50:02 +08:00 身为同行感觉我们玩的不是一个游戏 |
32 ibireme OP |
![]() | 34 justin2018 2020-10-21 21:11:56 +08:00 YY 大佬~ |
![]() | 35 Jasio 2020-10-21 21:28:00 +08:00 给大佬递茶 |
![]() | 36 inframe 2020-10-21 21:36:18 +08:00 给大佬递茶 |
![]() | 37 refine 2020-10-21 21:50:10 +08:00 给大佬倒波波茶 |
![]() | 38 Raven316 2020-10-21 22:27:26 +08:00 给大佬递茶 |
![]() | 39 whypool 2020-10-21 22:52:41 +08:00 给大佬递茶 |
![]() | 40 loveuqian 2020-10-21 22:56:42 +08:00 这是 YY 吧?膜拜一下 |
41 wzzzx 2020-10-21 23:02:16 +08:00 弱弱问一句,为什么使用 C89,不使用 C99 ? |
![]() | 42 creanme 2020-10-21 23:02:38 +08:00 给大佬递茶 |
![]() | 43 IvanLi127 2020-10-22 00:09:18 +08:00 via Android 给大佬递枸杞茶 |
![]() | 44 lisonfan 2020-10-22 00:27:17 +08:00 via iPhone 给大佬端一杯卡布奇诺 还做 iOS 吗? YYKit 还继续维护吗? |
![]() | 45 mathzhaoliang 2020-10-22 08:10:03 +08:00 大佬能在文章里讲讲代码结构么,我感觉单独看一行还能看懂,连起来就不知道在写什么了。 |
46 polymerdg 2020-10-22 08:35:54 +08:00 C 大佬 |
47 yangshebing 2020-10-22 09:28:48 +08:00 很好,很强大 |
![]() | 48 arnoldxiao 2020-10-22 09:59:51 +08:00 又见大佬出山 |
![]() | 49 nicebird 2020-10-22 10:20:08 +08:00 很猛的样子, |
50 BreadBig 2020-10-22 10:30:38 +08:00 敬仰 大佬 |
51 zjddp 2020-10-22 10:39:42 +08:00 YYKit 大佬! |
![]() | 52 arthasliu 2020-10-22 11:52:11 +08:00 给大佬递茶 |
53 ibireme OP @mathzhaoliang 从外面的 json_read 和 json_write 入口看进来就挺清晰了,代码里面是按功能分开的,数据结构可以看这里: https://github.com/ibireme/yyjson/blob/master/doc/DataStructure.md |
54 ibireme OP @wzzzx 其实用到 C99 的 stdint 和 stbool,但加一点兼容逻辑就能适配 C89 了。有些编译器比如旧一点的 msvc 是不支持完整 C99 的。 |
![]() | 55 codyfeng 2020-10-22 13:38:36 +08:00 via Android 牛啊,膜拜一下 |
![]() | 56 mathzhaoliang 2020-10-22 13:48:23 +08:00 @ibireme 那个 md 文档我能看懂,多谢。顺便问下为什么你的项目名字都带个 yy ? |
![]() | 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 也是时候排上日程表了 (滑鸡 |
![]() | 58 KeyboardManAnAn 2020-10-22 16:36:27 +08:00 @mathzhaoliang 早期 iOS 开发语言是 Objective-C ,因为没有命名空间,为了防止命名冲突,都会在自定义的类前面加上自己的名字(或者是项目的名字,或者是公司的名字)的缩写前缀, 以作区别. 现在大佬的项目还是加上 yy 前缀(大佬个人名字的汉语拼音缩写), 可能是历史遗留问题, 可能是强迫症使然, 不过更多可能的是品牌策略() |
![]() | 59 KeyboardManAnAn 2020-10-22 16:40:28 +08:00 @TangMonk 大佬的博客中有相关自述, 参见 https://blog.ibireme.com/2017/09/01/diary/#more-42043 |
60 thisisgpy 2020-10-22 17:55:29 +08:00 ![]() 大老牛逼,但是违反广告法了。 |
![]() | 61 andyhuzhill 2020-10-22 18:05:50 +08:00 @ibireme #54 话说 msvc 跳过 c99 开始支持 11 和 c17 了 |
![]() | 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 |
![]() | 63 onevcat 2020-10-22 21:08:08 +08:00 给大佬递茶 |
64 exceldream 2020-10-22 21:11:33 +08:00 via Android 为什么不叫 rocket json |
![]() | 65 Guaidaodl 2020-10-22 21:14:12 +08:00 给大佬跪下了. |
![]() | 66 KeyboardManAnAn 2020-10-23 08:01:42 +08:00 via iPhone @onevcat 大佬给大佬递茶 |
67 erpapa 2020-10-26 19:40:25 +08:00 给大佬递茶 |
![]() | 68 nonduality 2020-10-28 12:07:30 +08:00 对了,以你的 C 代码功力,章亦春很可能会要你,记得他创办的公司允许远程工作,兴许你可以看下他现在招不招人 github.com/agentzh weibo.com/agentzh |
![]() | 69 DinoStray 2021-01-07 17:54:09 +08:00 研究了一下, 觉得不敢用, 个人能力问题, 源码理解实在困难. 而且 C 的 API, 用在 CPP 还是太别扭了. |
![]() | 70 sunblackshine 2021-06-11 10:58:20 +08:00 我就一个问题,yy 是啥缩写 |
71 Erwinan 2021-09-09 15:54:09 +08:00 给大佬递茶 |