更强的 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.9
三份测试数据样本:
- 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.标准模式,保持与json-path兼容效果;2.非标准模式,函数使用余地更大
附1:snack3项目地址:
附2:..及函数表达式的兼容性说明
json-path:(snack3的标准模式同),处理策略如下:
- 选择器的执行顺序:(括号里的表达式处理后再聚合)
$..(ary2[0].a)$..(c.min())//如果c不是数组,此处会出错$..(ary2[0][0])
- 只能:
data.list[?(@ in $..ary2[0].a)] - 只能:在原数组节点上执行函数
snack3:(snack3的非标准模式),处理策略如下:
选择器的执行顺序:(括号里的表达式处理后再聚合)
($..ary2[0]).a($..c).min()//c是不是数组都正常 //实际使用中,这种会更方便,同时也兼容其它表达式($..ary2[0])[0]//这种会引起不同的结果 //不过实际中极少出现
可以:
data.list[?(@ in $..ary2[0].a)]或data.list[?(@ == $..ary2[0].a[0])]可以:在原数组节点上执行函数 或 查询结果上执行
附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
更强的 JsonPath 兼容性及性能测试的更多相关文章
- 更强的 JsonPath 兼容性及性能测试之2022版(Snack3,Fastjson2,jayway.jsonpath)
2022年了,重新做了一份json path的兼容性与性能测试.三个市面上流行框架比较性测试. 免责声明:可能测试得方式不对而造成不科学的结果(另外,机器不同结果会有不同),可以留言指出来.以下测试数 ...
- Delphi属性比对象的域有更强的功能
8.4 Delphi自定义组件(3) http://tech.163.com 2006-04-29 11:49:34 来源: 清华大学出版社 网友评论0 条 论坛 3. 测试未安装的组件 在将新组 ...
- 利用pyinotify监控文件内容,像tailf命令但比它更强
Linux的tail/tailf命令使用了内核提供的inotify功能,下面的Python例子也使用inotify实现比tail/tailf更强的监控文件功能. watchfile.py #!/usr ...
- 更强、更稳、更高效:解读 etcd 技术升级的三驾马车
点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 陈星宇(宇慕 ...
- C# 数据操作系列 - 18 让Dapper更强的插件
0. 前言 在前一篇中我们讲到了Dapper的应用,但是给我们的感觉Dapper不像个ORM更像一个IDbConnection的扩展.是的,没错.在实际开发中我们经常用Dapper作为对EF Core ...
- SOLOv 2:实例分割(动态、更快、更强)
SOLOv 2:实例分割(动态.更快.更强) SOLOv2: Dynamic, Faster and Stronger 论文链接: https://arxiv.org/pdf/2003.10152. ...
- Python装饰器:套层壳我变得更强了
Python装饰器:套层壳我变得更强了 Python装饰器:套层壳我变得更强了 关于作用域和闭包可以聊点什么? 什么是作用域 什么是闭包 装饰器:套层壳我变得更强了 参考资料 昨天阅读了<Pyt ...
- 更快、更强——解析Hadoop新一代MapReduce框架Yarn(CSDN)
摘要:本文介绍了Hadoop 自0.23.0版本后新的MapReduce框架(Yarn)原理.优势.运作机制和配置方法等:着重介绍新的Yarn框架相对于原框架的差异及改进. 编者按:对于业界的大数据存 ...
- 阿里与腾讯“智慧城市”的O2O谁更强?(分享)
成都亿合科技:本月22日蚂蚁金服联合新浪微博宣布“智慧城市”战略,用户可通过新浪微博.手机淘宝.支付宝三大客户端完成医疗.市政缴费以及相关信息查询工作,首批入驻城市有上海.太原.深圳.青岛等12个城市 ...
随机推荐
- leetcode算法小题(1)
题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...
- 知否知否,VS Code 不止开源
VS Code, 昨夜始于“开源”,如今“开源”深处渡. 读者看到这句话,也许会有疑惑,为什么两个“开源”都加上了双引号? 其实是笔者有意为之,因为这个两个“开源”的意义有着很大的差别,第一个“开源” ...
- 使用Java调用exe可执行文件
一.出发点 平日里,我们看到了很多已经成型的可执行文件,而且经过了一定的封装.因为开源的关系,大多时候可以自己使用eclipse进行编译,但也常常遇到不如直接调用更加方便的情况.那么这时候,我个人需要 ...
- 使用Typescript重构axios(十四)——实现拦截器
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- TCP协议--TCP三次握手和四次挥手
TCP三次握手和四次挥手 TCP有6种标示:SYN(建立联机) ACK(确认) PSH(传送) FIN(结束) RST(重置) URG(紧急) 一.TCP三次握手 第一次握手 客户端向服务器发出连 ...
- php编辑器notepad++ 推荐一款非常好看主题和字体
php编辑器notepad++ 推荐一款非常好看主题和字体1.主题名称:Obsidian 2.字体字号:Courier New 10 3.设置方法:设置---语言格式设置---选择主题,同时勾选“使用 ...
- PHP根据ip获取地理位置(通过高德地图接口)
PHP根据ip获取地理位置(通过高德地图接口)<pre>//restapi.amap.com/v3/ip?key=2004f145cf3a39a72e9ca70ca4b2a1dc& ...
- 本周授课内容:http,https,Tomcat,servlet
https:https是基于安全套接字的http协议,也可以理解为是http+ssl/tls(数字证书)的组合 http和https的区别: HTTP 的 URL 以 http:// 开头,而 HTT ...
- python Django框架正式准备工作
之前由于不太了解数据库方面的知识,但经过一段时间的web应用的开发学习,成功的用其他框架连接了数据库,并完成了相关操作,数据爬取也初识了,更了解了python这门语言的语法,但路还很长,因此现在才能正 ...
- Ansible之入门简介
一.ansible简介 ansible是一款由python语言编写的一款自动化运维工具,它集合了众多运维工具(puppet.cfengine.chef.func.fabric)优点,实现了批量系统配置 ...