博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
json工具性能比较:json-lib和jackson进行Java对象到json字符串序列化[转]
阅读量:6346 次
发布时间:2019-06-22

本文共 1545 字,大约阅读时间需要 5 分钟。

网上查找“java json”,发现大家使用最多的还是json-lib来进行java对象的序列化成json对象和反序列化成java对象的操作。但是之前在网上也看到过一往篇关于json序列化性能比较的文章,不过一下子找不到了,所以没有引用。另外公司同事也做过类似的测试,结果都表明,json-lib的性能不太令人满意,而一个叫jackson的json序列化工具却表现不俗,另外,json-lib对null值的处理让人也感觉比较困惑。 
    这里,我也对这两个java json工具进行了一次粗略的测试,主要测试从java对象序列化成json字符串的性能。按以下三种方式进行: 

  1. 使用jackson,并在每次循环中重用ObjectMapper对象(jackson with cache)
  2. 使用jackson,并在每次循环中重新生成ObjectMapper对象(jackson without cache)
  3. 使用json-lib
  4. 直接使用StringBuffer进行字符串拼接


    因为见过有人在使用jackson时,每次都new 一个ObjectMapper的情况,而在官方教程中看到过这样一段话(can reuse, share globally) 

Java代码
  
  1. ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally  
  2. User user = mapper.readValue(new File("user.json"), User.class);  


即ObjectMapper可以重用,所以这里同时进行重用和不重用方式的测试,另外还测试直接使用StringBuffer拼接字符串的方式,以比较json序列化与原始的java方法的性能差异。 
    这里以不断增加并发线程数,每个线程循环进行1000次序列化,每次进行100次测量,结果取一个线程跑完(即序列化完1000次)的时间平均值的方式测试在多线程并发情况下的性能。 

Java代码
  
  1. 测量次数 = 100  
  2. 每个线程循环进行序列化次数 = 1000  
  3. 平均时间为一个线程跑完时间 = 总时间/测量次数/线程数  


    测试的java对象包含了基本类型属性和复杂属性,并且对象具有继承关系 
 
 
 
 
    注:内存使用情况的数据据仅供参考,这个结果并不准确,因为受机器影响比较大,每次测试差异也比较大,不能准确说明问题,但还是可以参考一下。 

结论代码
  
  1. 从上面的两个时间性能的图中可以看出,无论是在低并发还是高并发的情况下,时间性能上,jackson使用重用ObjectMapper方式大大优于使用json-lib方式,甚于jackson使用非重用ObjectMapper方式也略优于json-lib方式。另外也可以看出,jackson在重用ObjectMapper的方式下,性能几乎接近于直接使用StringBuffer的append方法拼接了,尤其在高并发的情况下,两者的曲线几乎要重合了。从这里可以看出jackson的性能非常出色。  
  2. 另外,从两个空间性能的图中得出的结论与时间性能基本相同,但是由于内存的使用量波动较大,每次测量的结果也相差比较大,并不十分准确,但还是可以看出个大概。  
  3. 此外,还发现一个现象,在低线程数的情况下,只开一个线程的时间性能要比同时开多个线程的时间性能差不少,具体原因还有待分析,不知道是否与双核CPU有关。  


    另外附上测试代码,其中使用了一个同事写的测试工具,叫nanobench.jar的jar包(这个工具会在每次测试前每做一次“预热”,以排除干扰,因为java虚拟机刚开始运行时会比较慢。并在测试前会做机器资源清理工作,以减小每次测试受上次测试的影响,参考源码:)。 

转载地址:http://jlcla.baihongyu.com/

你可能感兴趣的文章
Oracle 客户端安装
查看>>
洛谷 P1744(迪杰斯特拉)
查看>>
win7 配置IIS + php 环境
查看>>
[UML]UML系列——用例图中的各种关系(include、extend)
查看>>
若要调试此模块,请将其项目生成配置更改为“调试”模式。若要取消显示此消息,请禁用“启动时若没有用户代码则发出警告”调试器选项。...
查看>>
08.Python网络爬虫之图片懒加载技术、selenium和PhantomJS
查看>>
java_socket套接字网络编程_实现多线程聊天
查看>>
SpringMVC + Spring + MyBatis 学习笔记:在类和方法上都使用RequestMapping如何访问
查看>>
[转载]使用RoboCopy 命令
查看>>
清楚浮动的应用
查看>>
spring cloud学习(五) 配置中心
查看>>
Oracle误删除表空间的恢复
查看>>
C++的继承与多态
查看>>
CSS3 Border-image
查看>>
洛谷P4769 冒泡排序
查看>>
固定思维的可怕(转)
查看>>
pimple idiom C++
查看>>
关于Session为null的问题。。。
查看>>
新的开始,一切归零
查看>>
tomcat 详解 catalina.home和catalina.base
查看>>