更强的 JsonPath 兼容性及性能测试
更强的 JsonPath 兼容性及性能测试
最近给自己的json
框架snack3
添加了json path
支持。搞好之后,找了两个市面上流行框架比较性测试,以助自己改进框架的性能和兼容性。
测了一圈之后,发现snack3
兼容性良好,性能更是最好的。晚上要喝点小酒庆祝一下!!!
免责声明:我也是个java新手,可能测试得方式不对而造成不科学的结果,可以留言指出来。以下测试数值只对我的电脑有效(配置:Macbook pro 13 2018款 i7+16G+512G)。
Snack3 借签了 Javascript
所有变量由 var
申明,及 Xml dom
一切都是 Node
的设计。其下一切数据都以ONode
表示,ONode
也即 One node
之意。
- 强调文档树的操控和构建能力
- 做为中间媒体,方便不同格式互转
- 高性能
Json path
查询(兼容性和性能很赞) - 支持
序列化、反序列化
本案测试用的三个框架及版本:
- com.alibaba:fastjson:1.2.29
- com.jayway.jsonpath:json-path:2.2.0
- org.noear:snack3:3.1.5.3
三份测试数据样本:
- A:
{code:1,msg:'Hello world',data:{list:[1,2,3,4,5], ary2:[{a:2},{a:3,b:{c:'ddd'}}]}}
- B:
[{b:{c:1}}, {b:{d:1}}, {b:{c:2}}, {b:{c:23}}]
- C:
[{c:'aaaa'}, {b:'cccc'}, {c:'cccaa'}]
测试方案:
1.测试伪代码
var text = "..."; //1.预解析json var obj = JSON.parse(text); long start = System.currentTimeMillis(); for(int i=0,len=1000000; i<len; i++) { //2.执行json path JSONPath.eval(obj,"$..."); } //3.100万次的消耗时间(记录的数值就是这个) long times = System.currentTimeMillis() - start; System.out.println(times);
2.每个框架、每个表达式各执行4次,并记录后3次消耗时间
3.最后制成对比表格
4.测试结果:
Json path表达式 | 数据 | fastjson | json-path | snack3 |
---|---|---|---|---|
$..a | A | 529,546,539 | 2658,2633,2590 | 225,225,232 |
$..* | A | (不兼容1) | 3227,3220,3156 | 306,315,325 |
data.list[1,4] | A | 85,90,86 | 782,798,776 | 133,137,131 |
data.list[1:4] | A | 105,109,109 | 941,899,947 | 143,145,146 |
data.ary2[1].b.c | A | 60,58,58 | 929,826,837 | 84,86,80 |
data.ary2[*].b.c | A | (不兼容2) | 1105,1025,1050 | 173,152,155 |
$..b[?(@.c == 12)] | B | (不兼容2) | 5628,5739,5636 | 580,535,532 |
$..c.min() | B | (不兼容2) | (不兼容2) | 279,282,285 |
$[?(@.c =~ /a+/)] | C | (不兼容2) | 3575,3591,3813 | 444,423,429 |
$..ary2[0].a | A | 325,321,319 | 2522,2551,2591 | 310,311,314 |
data.list[?(@ in $..ary2[0].a)] | A | (不兼容2) | 5494,5326,5483 | 678,674,667 |
注:
- 不兼容1 : 直接返回了根节点自己
- 不兼容2 : 直接异常
总结
- fastjson 毫无兼容性可言
- json-path 性能不理想,函数使用局限性大
- snack3 性能最好,函数使用余地更大
附1:snack3项目地址:
附2:..及函数表达式的兼容性说明
json-path:从测试的情况看,处理策略如下:
- 1.带..输出必为数组;如果有[x],合并为一维数组
- 2.优选顺序:(括号里的表达式处理后再聚合)
$..(ary2[0].a)
$..(c.min())
//所以会出错 - 3.只能:
data.list[?(@ in $..ary2[0].a)]
- 4.只能:在原数组节点上执行函数
snack3:从测试的情况看,处理策略如下:
-
1.带..输出必为数组;如果有[x],合并为一维数组
-
2.优选顺序:(括号里的表达式处理后再聚合)
($..ary2[0]).a
($..c).min()
//所以会有结果 //实际使用中,这种会更方便,同时也兼容其它表达式 -
3.可以:
data.list[?(@ in $..ary2[0].a)]
或data.list[?(@ == $..ary2[0].a[0])]
-
4.可以:在原数组节点上执行函数 或 查询结果上执行
附3:测试代码
com.alibaba:fastjson
测试代码:https://gitee.com/noear/snack3/blob/master/snack3_demo/src/test/java/speed/SpeedFastjsonJsonPathTest.javacom.jayway.jsonpath:json-path
测试代码:https://gitee.com/noear/snack3/blob/master/snack3_demo/src/test/java/speed/SpeedJaywayJsonPathTest.javaorg.noear:snack3
测试代码:https://gitee.com/noear/snack3/blob/master/snack3_demo/src/test/java/speed/SpeedJsonPathTest.java
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
免费12个月!阿里云助力中小企业0成本上云
最新消息,阿里云宣布为企业用户推出云服务器免费12个月扶持计划,助力中小企业0成本上云。阿里云表示,该计划每年投入2000万,超5万中小企业受益,本计划已于2019年11月27日上线。 阿里云智能总裁张建锋在2019阿里云峰会上海站上提出“全面上云的拐点到了!”为了更好的帮助中小企业成长,帮助企业从传统IT向云计算全面转移,阿里云也加大对中小企业全面扶持上云的力度。虽然,现在已有上万家企业将IT系统全面迁移到阿里云,比如飞利浦中国、迅雷、万科物业、百丽、居然之家、西贝莜面村等。但目前更广大的中小企业上云的需求普遍仍然未被满足。经调研,目前部署在所有公共云上的工作负载仍然不超过总负载的20%,这意味着仍有80%的工作负载仍然部署在线下的各个IDC机房,自建机房以及企业自己维护的服务器上,为了能引导企业消除上云的心理门槛,降低企业上云的成本,阿里云推出了企业免费12个月扶持计划,助力中小企业0成本上云。 免费用一年 可满足企业建站、开发测试等场景 本次推出的企业免费12个月计划,将为中小企业提供最新一代入门级云服务器—突发性能实例T6(以下简称T6)相比上一代T5实例,其规格基准性能提升,...
- 下一篇
一款快速生成安卓shape的插件--NoCodeShape
一、NoCodeShape介绍 NoCodeShape是一个能可视化界面操作生成Android中Shape.xml的Android Studio插件。对于新手能更好的去接受Android中相对应的属性,对于资深程序员则能简化操作,快速生成shape.xml。 二、NoCodeShape使用方法 1. 下载和安装 同一般的Android Studio插件下载一样,可以直接Preferences->Plugins 搜索 NoCodeShape搜索出来结果直接安装再重启即可。 也可以去jetbrains插件管理的官网下载各个版本的插件 https://plugins.jetbrains.com/plugin/13325-nocodeshape/versions 然后Preferences->Plugins 再Install plugins from disk从本地安装 2. 如何使用 在新建一个shape.xml文件后,右键选择NoCodeShape或者直接按快捷键Common+U 然后选择自己想要的属性,随着点击事件的进行会生成相关xml代码,并在Android Studio右...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用