得到 jason中 string 的值_简单高性能的Json解析器: Jason

最近尝试用Java写了一个Json解析器,支持绑定到类上创建对象. 暂时不想支持很多特性,只想如何最高效地把Json反序列化成对象. 目前成果还比较初步,但初衷已经满足了. 开源出来请大家提出任何意见以继续改进.

https://github.com/dwing4g/jason​github.com

性能测试程序及版本(均为目前最新发布版本):

 Jackson: 2.10.2
FastJson: 1.2.62
Dsl-Json: 1.9.5
Jsoniter: 0.9.23 (含javassist: 3.26.0)
   Jason: 当前版本(2020-03-01 16:47:07)

性能测试结果(时间越短越好) (测试环境: AdoptOpenJDK 13.0.2 x64, Win10, 默认JVM参数):

 Jackson: 5963ms (使用Afterburner插件实时生成字节码)
FastJson: 4196ms (实时生成字节码)
Dsl-Json: 3782ms (非生成代码版本,生成代码版本用起来很繁琐,有人测过请在评论中留言)
Jsoniter: 2007ms (实时生成代码)
   Jason: 1732ms (无生成代码,使用高性能反射)

测试一轮(反序列化1000万个对象)的内存分配量:

 Jackson: 8016MB
FastJson: 4428MB
Dsl-Json: 1530MB
Jsoniter: 1374MB (除了反序列化的对象本身之外几乎无开销)
   Jason: 1374MB (除了反序列化的对象本身之外几乎无开销)

性能测试代码:

import 

目前还只是初始版本(只有一千多行代码,支持JDK8及更高版本), Json的解析算法暂时只参考了RapidJSON的数字解析. 后续还会再学习其它实现中的优秀之处.


2020-02-26 补充一些说明:

  1. 上面的性能测试是在AMD的CPU上统计的, 之后在Intel i7的CPU上测出的结果有些出入, 主要是Jsoniter表现得更好了, 结果跟Jason很接近, 不得不佩服Jsoniter的性能.
  2. 如果有人现在需要生产用途的Json库, 推荐用Jsoniter, 代码质量也比FastJson好不少, 可惜Jsoniter已经有一段时间没更新维护了, 不知道何时出1.0版本.
  3. Jsoniter的代码编译使用了Javassist库, 但我认为可以直接调用JDK内置的编译, 做到完全无三方依赖.
  4. Jason支持JDK8以上, 但推荐运行在JDK9以上. 因为Jason用了一些JDK9才有的优化, 而且一些底层调用在JDK9以上能更高效地运行.
  5. Jason的数字解析参考了目前最快的RapidJSON的实现, 也做了少量Java特定的优化, 最终跟C++版本的性能差距不大了. 比Jsoniter的相关实现快一些.
  6. Jason除了支持JSON标准之外, 还支持忽略多余的逗号, 支持不带引号的key. 其它扩展(如注释)的支持待考虑. 另外Jason对不标准的JSON有一定程度的容忍, 但这是快速解析的副作用, 不能当做feature. 另外Jason目前只支持UTF-8编码的字节数组作为输入.
  7. Jason支持了动态确定类型的parser. 有两种方法, 一种见其中的Parser类(推荐), 另一种见其中的Pos类.
  8. Jason用了很多JDK中Unsafe的调用, 这个是非公开API, 因此不支持Android.
  9. Jason还缺乏充足的测试代码, 后续会逐渐补充.
  10. Jason后续有打算做序列化功能. 但不确定何时完成.
  11. Jason有打算增加文档, 如果有足够关注的话.

2020-02-27 补充一些说明:

  1. 昨天在Intel i7上测试, Jsoniter和Jason的性能差不多. 是5个测试交替顺序测试的, 改成各自测5遍时Jason又明显更快了.
  2. hash的乘法系数如果把常量改成变量, 在AMD上性能几乎没区别, 但Intel i7上常量比变量快一些. 暂时设定为常量, 如果有人遇到冲突,那么就自己改常量值或者改为变量吧.
  3. Jason目前的版本已经稳定, 在一些重度任务中表现稳定, 暂时没有bug了.

2020-03-01 补充一些说明:

  1. 初步实现了序列化功能(JasonWriter). 整数和浮点数的序列化也参考了RapidJSON的实现(约70%的C++版本性能).
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值