json工具性能比较:json-lib和jackson进行Java对象到json字符串序列化[转]
网上查找“java json”,发现大家使用最多的还是json-lib来进行java对象的序列化成json对象和反序列化成java对象的操作。但是之前在网上也看到过一往篇关于json序列化性能比较的文章,不过一下子找不到了,所以没有引用。另外公司同事也做过类似的测试,结果都表明,json-lib的性能不太令人满意,而一个叫jackson的json序列化工具却表现不俗,另外,json-lib对null值的处理让人也感觉比较困惑。
这里,我也对这两个java json工具进行了一次粗略的测试,主要测试从java对象序列化成json字符串的性能。按以下三种方式进行:
- 使用jackson,并在每次循环中重用ObjectMapper对象(jackson with cache)
- 使用jackson,并在每次循环中重新生成ObjectMapper对象(jackson without cache)
- 使用json-lib
- 直接使用StringBuffer进行字符串拼接
因为见过有人在使用jackson时,每次都new 一个ObjectMapper的情况,而在官方教程中看到过这样一段话(can reuse, share globally)http://jackson.codehaus.org/Tutorial:
- ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
- User user = mapper.readValue(new File("user.json"), User.class);
即ObjectMapper可以重用,所以这里同时进行重用和不重用方式的测试,另外还测试直接使用StringBuffer拼接字符串的方式,以比较json序列化与原始的java方法的性能差异。
这里以不断增加并发线程数,每个线程循环进行1000次序列化,每次进行100次测量,结果取一个线程跑完(即序列化完1000次)的时间平均值的方式测试在多线程并发情况下的性能。
- 平均时间为一个线程跑完时间 = 总时间/测量次数/线程数
测试的java对象包含了基本类型属性和复杂属性,并且对象具有继承关系。
注:内存使用情况的数据据仅供参考,这个结果并不准确,因为受机器影响比较大,每次测试差异也比较大,不能准确说明问题,但还是可以参考一下。
- 从上面的两个时间性能的图中可以看出,无论是在低并发还是高并发的情况下,时间性能上,jackson使用重用ObjectMapper方式大大优于使用json-lib方式,甚于jackson使用非重用ObjectMapper方式也略优于json-lib方式。另外也可以看出,jackson在重用ObjectMapper的方式下,性能几乎接近于直接使用StringBuffer的append方法拼接了,尤其在高并发的情况下,两者的曲线几乎要重合了。从这里可以看出jackson的性能非常出色。
- 另外,从两个空间性能的图中得出的结论与时间性能基本相同,但是由于内存的使用量波动较大,每次测量的结果也相差比较大,并不十分准确,但还是可以看出个大概。
- 此外,还发现一个现象,在低线程数的情况下,只开一个线程的时间性能要比同时开多个线程的时间性能差不少,具体原因还有待分析,不知道是否与双核CPU有关。
另外附上测试代码json-test.rar,其中使用了一个同事写的测试工具,叫nanobench.jar的jar包(这个工具会在每次测试前每做一次“预热”,以排除干扰,因为java虚拟机刚开始运行时会比较慢。并在测试前会做机器资源清理工作,以减小每次测试受上次测试的影响,参考源码:http://code.google.com/p/nanobench/source/checkout)。
json工具性能比较:json-lib和jackson进行Java对象到json字符串序列化[转]的更多相关文章
- JackSon将java对象转换为JSON字符串
JackSon可以将java对象转换为JSON字符串,步骤如下: 1.导入JackSon 的jar包 2.创建ObjectMapper对象 3.使用ObjectMapper对象的writeValueA ...
- (后端)JackSon将java对象转换为JSON字符串(转)
转载小金金金丶园友: JackSon可以将java对象转换为JSON字符串,步骤如下: 1.导入JackSon 的jar包 2.创建ObjectMapper对象 3.使用ObjectMapper对象的 ...
- 使用jackson对Java对象与JSON字符串相互转换的一些总结
本文为菠萝大象原创,如要转载请注明出处.http://www.blogjava.net/bolo 代码无真相,为了最简单的说明,我直接上代码. public class User { private ...
- 使用Jackson在Java中处理JSON
在工作中实际使用到Java处理JSON的情况,且有很大部分都使用的是开源工具Jackson实现的. 一.入门 Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换. ...
- jackson java对象和json对象的互相转换
概述 Jackson框架是基于Java平台的一套数据处理工具,被称为“最好的Java Json解析器”. Jackson框架包含了3个核心库:streaming,databind,annotation ...
- Java对象、Json、Xml转换工具Jackson使用
在Java项目中將一个对象转换成一段Json格式的字符串是非常常见的,能够实现这种需求的工具包也比较多,例如Gson.JSON-lib.Jackson等等.本文主要介绍Jackson的使用,Jacks ...
- Jackson实现Object对象与Json字符串的互转
在项目开发过程中,当客户端与服务器响应时,数据交互是必不可少的.然而通过Json实现数据交互成为我们开发中的一部分,进而Jackson为我们的Json转化提供了很好的机制.下面我将利用实例总结如何使用 ...
- 使用Jackson来实现Java对象与JSON的相互转换的教程
一.入门Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换.1.JAVA对象转JSON[JSON序列化] 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- FastJson、Jackson、Gson进行Java对象转换Json细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
随机推荐
- hdu 5800 To My Girlfriend(背包变形)
To My Girlfriend Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- JS中apply与call的用法
JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 先来看看JS手册中对call的解释: call 方法调用一个对象的一个方法,以另一个对象替换当前对象. cal ...
- UI-基本控件的简单使用
1.IBAction: //====================== 1> 能保证方法可以连线 2> 相当于void 2.IBOutlet: 1> 能保证属性可以连线 3.常 ...
- 对于get方法是否需要synchronized修饰
具体用法没有总结,只是说明一个用法而已,对于以前个人理解出现的偏差 [问题描述] 对于一个计数功能的实现,获取值的方法是否需要加锁? [以前理解] 我只需要在进行累加的方法上进行加锁即可,这样保证其可 ...
- Python模块化
在Python中,一个.py文件就称之为一个模块(Module). 模块化的好处: 1.大大提高了代码的可维护性. 2.编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的 ...
- dilworth定理+属性排序(木棍加工)
P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...
- Quartz创建多个不同名字的scheduler实例
_http://my.oschina.net/laiweiwei/blog/122280 需求创建多个不同的Scheduler实例,每个实例自主启动.关闭 问题 如果直接用 SchedulerFact ...
- vue 初级小总结
(1)插值,即渲染文本 文本:数据绑定最常见的形式就是使用 {{...}}(双大括号)的文本插值 <h1>{{ message }}</h1> data() { return ...
- index、noindex、follow、nofollow的使用说明
爬虫是目前最常见的网络程序,曾经有过统计,说是目前的网络流量有一半以上是爬虫使用的.虽然爬虫程序随处可见,但是并不代表这种做法就是合理合法的. 在抓取网页时,我们要让自己的爬虫遵守Robot.txt协 ...
- python基础第一章
Python基础 第一个python程序 变量 程序交互 基本数据类型 格式化输出 基本运算符 流程控制if...else... 流程控制-循环 第一个python程序 文件执行 1.用notepad ...