更强的 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项目地址:

  • https://github.com/noear/snack3
  • https://gitee.com/noear/snack3

附2:..及函数表达式的兼容性说明

json-path:(snack3的标准模式同),处理策略如下:
  1. 选择器的执行顺序:(括号里的表达式处理后再聚合)

    • $..(ary2[0].a)
    • $..(c.min()) //如果c不是数组,此处会出错
    • $..(ary2[0][0])
  2. 只能:data.list[?(@ in $..ary2[0].a)]
  3. 只能:在原数组节点上执行函数
snack3:(snack3的非标准模式),处理策略如下:
  1. 选择器的执行顺序:(括号里的表达式处理后再聚合)

    • ($..ary2[0]).a
    • ($..c).min() //c是不是数组都正常 //实际使用中,这种会更方便,同时也兼容其它表达式
    • ($..ary2[0])[0] //这种会引起不同的结果 //不过实际中极少出现
  2. 可以:data.list[?(@ in $..ary2[0].a)]data.list[?(@ == $..ary2[0].a[0])]
  3. 可以:在原数组节点上执行函数 或 查询结果上执行

附3:测试代码

  • com.alibaba:fastjson 测试代码:https://gitee.com/noear/snack3/blob/master/snack3_demo/src/test/java/speed/SpeedFastjsonJsonPathTest.java
  • com.jayway.jsonpath:json-path 测试代码:https://gitee.com/noear/snack3/blob/master/snack3_demo/src/test/java/speed/SpeedJaywayJsonPathTest.java
  • org.noear:snack3 测试代码:https://gitee.com/noear/snack3/blob/master/snack3_demo/src/test/java/speed/SpeedJsonPathTest.java

原文地址:https://www.cnblogs.com/noear/p/11978399.html

时间: 2024-10-12 04:38:49

更强的 JsonPath 兼容性及性能测试的相关文章

创建功能更强的类型

抽象的过程 *计算机的工作是建立在抽象的基础上. -机器语言和汇编语言是对机器硬件的抽象 -高级语言是对汇编语言和机器语言的抽象 *现有抽象的问题: -要求程序员按计算机的结构去思考,而不是按要解决的问题的结构去思考. -当程序员要解决一个问题时,必须要在机器模型和实际要解决的问题模型之间建立联系. -而计算机的结构本质上还是为了支持计算,当要解决一些非计算问题时,这个联系的建立是很困难的 面向对象的程序设计 *为程序员提供了创建工具的功能 *解决一个问题时 -程序员首先考虑的是需要哪些工具 -

STM32的Cortex-M3核与ARM7有何区别?哪个性能更强?

STM32的Cortex-M3核与ARM7有何区别?哪个性能更强?,布布扣,bubuko.com

JcJc对政府网站公文错别字识别的能力更强了

JcJc对政府网站公文错别字识别的能力更强了 最近一直在忙着改进JcJc错别字检查软件的识别准确度, 特别是应客户的要求添加了对政府网站公文内容的检查. 说实话,做错别字检查这么长时间,深刻体会到文章中被查出错别字的苦衷. 拼音输入法,五笔输入法都会产生错别字.大家平常工作都很忙,如果不是有任务在头上,谁也不会,对着文章看好几遍. 报社.杂志因为有专业的岗位负责校对,所以从流程上会降低错别字出现的概率. 可是政府网站你总不能设立类似的岗位吧? 今天太晚了, 先上个图吧,大家看看效果:   htt

利用pyinotify监控文件内容,像tailf命令但比它更强

Linux的tail/tailf命令使用了内核提供的inotify功能,下面的Python例子也使用inotify实现比tail/tailf更强的监控文件功能. watchfile.py #!/usr/bin/python import sys, os, pyinotify notifier = None monfile = None lastsize = 0 wm = None wd = 0 def roll_file(filename): global lastsize fd = os.op

马云最新发言:让员工、客户、合作伙伴比自己更强

在10月25日举行的第三届世界浙商大会在浙江举行,阿里巴巴董事局主席.浙商总会首任会长马云做主旨演讲表示,从强我变成利他思想,是21世纪企业必须要有的素质,你要让你的员工比你聪明.比你更了解信息和数据.让你的员工有更强的能力,让你的客户.合作伙伴更强. 等到30年后,你再回头看看.我的好处在于,我们公司其他人在干活,而我是在胡思乱想. 第三届世界浙商大会_马云 以下为演讲内容: 感谢大家的信任,当了“官”(浙商总会会长),我上一次当官是1985年,杭州师范学院的学生会主席.这两个“官”,在我看来

面对失败与困境保持更强的韧性

1 曾经我的字很丑,而且是那种"天下谁人能识君"的丑. 初中的时候,老师提名班里写字最"狂野"的四个人,并给他们颁奖"四大草书大王".我遗憾落选,因为老师觉得我的字已经脱离了文字的范畴,仓颉再生都无法作出评判,做到了真正意义上的"鬼斧神工". 同学们经常拿这个和我开玩笑,老师也屡次劝我改"写"归正. 当然,最为光火的便是我老爸,他始终认为字如其人,一个人的字迹完全可以代表他的精神气质与生活态度.我觉得这压根

【特别推荐】 &nbsp; 女人的欲望比男人更强这就是婚姻 情家缘——有缘有情共爱一个家 一起脱单吧

男人不需要能力很强,但必须有保护妻儿的本事3,一个女强人的老公,必定是个普通人.[推荐文章]爱情的期待与不安[推荐文章]男人未从心里接受女人的11个表现[特别推荐]20条驭夫心经让老公服服帖帖 2,一个泼妇型的女人,她背后的男人,也许就那种不善言语的老实人.后来会离婚,说是「看走眼」.沧桑的女人,日夜为生计奔波,为了儿女的学费,为了老人的养老费而省吃俭用,更舍不得为自已买几件象样的衣裳.日子过的清苦和辛酸.[特别推荐]21个你不懂的床上秘密[推荐文章]八个妙招助夫妻房事更加激情4,一个为钱奔命的

想让无线覆盖信号更强吗?

如今,无线网络技术已经蔓延到人们生活的方方面面.各行各业都与无线覆盖带来的便利密不可分.甚至许多家庭使用无线网卡和无线路由器来建立家庭局域网.但是,使用无线路由器建立网络将极大地影响数据传输信号.如果信号强度不够大,所使用的无线网络的数据传输效率将不可避免地变慢,尽管上述提示将使无线网络信号强度有一定程度.改进,但路由器本身的实际发射功率是决定性因素.因此,在无线AP部署时,很容易出现一些常见故障,那么如何避免和解决这些故障,是否要使无线覆盖信号更强?我们必须掌握一些最基本的无线AP部署问题.

没有所谓的人脉,只有更强的自己

我刚上班的时候,有一个比我大了一岁的男同事,反反复复告诉我:“要注意积累你的人脉,不能只顾着交朋友,你这样以后是没什么资源的.” 我问他:“人脉不就是朋友吗?” 他冷笑了一句:“不是,你记住我的话,别忘了就行.什么是人脉和资源,以后你就知道了.” 我靠!不就比我大了一岁么,卖什么关子啊!我过了很长很长时间才明白,他说的人脉是什么. 我这个男同事是这样的:永远西装革履,皮鞋锃亮.其实做这行的没必要穿成华尔街精英.对这种和同事形成的强烈反差,他的回答是:“我要穿得和精英一样,才能离精英更近.” 好好