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

2016-12-12 20:18:50 +08:00
 taowen

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

Java 版本跑分

Go 版本跑分

17941 次点击
所在节点    分享创造
34 条回复
majinjing3
2016-12-12 20:28:25 +08:00
支持,建议加到 awesome-go 里面哈,
crytis
2016-12-12 20:37:02 +08:00
矮油,你这测试的,为啥 fastjson 比 jackson 慢?跟阿里的测试不符啊,还有,能差这么多性能?
taowen
2016-12-12 20:38:22 +08:00
@crytis https://github.com/fabienrenaud/java-json-benchmark 我从这里 fork 的。别人测的也是这个结果。 fastjson 就是不快啊。
a3mao
2016-12-12 20:44:13 +08:00
能否说说是怎么实现的?为啥会这么快?
taowen
2016-12-12 20:50:42 +08:00
irgil
2016-12-12 20:56:41 +08:00
taowen
2016-12-12 20:58:52 +08:00
@irgil 这个是代码生成的。鉴于这么多人反馈,我还是缩进一下吧
0915240
2016-12-12 21:05:02 +08:00
比其他的快这么多吗?
taowen
2016-12-12 21:07:22 +08:00
@0915240 自测的结果。欢迎第三方验证。我觉得也有点诡异。
zcbenz
2016-12-12 21:13:27 +08:00
和 rapidjson 相比如何?速度的差异有可能是实现不完全,或者测试案例有特例, rapidjson 的作者有一供一套完整的 benchmark 。

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/327154

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX