文档章节

Fastjson和Jackson序列化和读取json的性能实测

derekxyz
 derekxyz
发布于 2014/04/24 13:40
字数 722
阅读 5813
收藏 4

偶然间看到的阿里出品的Fastjson,网上对这个json包好评如潮,性能胜Jackson10倍。
本人本着眼见为实的想法,自己测试一下两者的性能比较。

###测试### POJO对象名字为User,具体代码就不贴了,里面有两个属性,分别是int类型的id和String类型的name,很简单的一个类。

测试程序(只是简单的测试下,这里并未深究其中的各种构造方法)

    public class MyMain {
	private static final int TEST_CASE_NUM = 1000;
	public static void main(String args[]) throws IOException {

		List<User> users = new ArrayList<User>();
		Random random = new Random();

		for (int i = 0; i < TEST_CASE_NUM; i++) {
			User user = new User();
			user.setId(random.nextInt(10));
			user.setName("123");
			users.add(user);
		}

		Monitor.begin();
		for (User u : users){
			String s = JSON.toJSONString(u);
		}
		Monitor.end("serilization of fastjson");

		Monitor.begin();
                                    /**
		 * 这里仅创建一个ObjectMapper实例
		 * 而网上的很多测试程序中,把实例的创建过程
		 * 加入到了for循环中,因此测出来的序列化性能
		 * 有10倍之差,其实其中大部分都消耗在了ObejectMapper
		 * 实例创建上。
		 */
		ObjectMapper objectMapper = new ObjectMapper();
		for (User u : users){
			String s = objectMapper.writeValueAsString(u);
		}
		long endjackson = System.currentTimeMillis();
		Monitor.end("serilization of jackson");


		List<String> strs = new ArrayList<String>();
		for (int j = 0; j < TEST_CASE_NUM; j++) {
			String s = new String("{\"id\":1,\"name\":\"123\"}");
			strs.add(s);
		}

		Monitor.begin();
		for (String s : strs){
			User user = JSON.parseObject(s,User.class);
		}
		Monitor.end("reading string by fastjson");

		Monitor.begin();
                                    ObjectMapper obj = new ObjectMapper();
		for (String s : strs){
			User user = obj .readValue(s,User.class);
		}
		Monitor.end("reading string by jackson");
	}
}

运行程序得到输出:

    serilization of fastjson use 158 ms
serilization of jackson use 339 ms
reading string by fastjson use 49 ms
reading string by jackson use 73 ms

多次运行后结果相差甚微,比例关系基本保持稳定。由此可见fastjson并未如网上传言那般,性能较之于jackson提升10倍。如果将ObjectMapper实例的创建过程也从计时器中提取出来,哪么Jackson与fastjson的序列化性能几乎相同。
然而在反序列方面,fastjson以巨大的优势领先Jackson,将测试的用例个数增加至1000000,得到的输出为:

    reading string by fastjson use 505 ms
reading string by jackson use 1051 ms

fastjson几乎只需要Jackson的一半时间,这个表现相当亮眼。

在这里我们反序列化的字符串是按照实体类中属性的顺序排列的,如果打乱一下顺序呢?
这里还是使用1000000个测试用例,得到的输出结果为:

    reading string by fastjson use 715 ms
reading string by jackson use 1049 ms

因为fastjson默认开启了sort field martch优化算法,打乱顺序之后性能下降,但仍然领先Jackson不少。

###总结### 这次测试使用的是1.9.31版本的Jackson和1.1.39版本的fasijson,测试结果表名fastjson和Jackson在序列化性能上相差不大(主要ObjectMapper类新建实例耗费不少时间),但是在反序列化方面,fastjson要明显领先于Jackson。

© 著作权归作者所有

derekxyz
粉丝 4
博文 14
码字总数 5541
作品 0
长宁
程序员
私信 提问
fastjson 发布 1.1.0 版本

这个版本引入了asm优化encode和decode的性能,使用了新的预测读取优化算法,大幅度提升了decode的性能。这个版本没有bug fixed。 Improvement [FASTJSON-51] - 提供按字段名称顺序输出,具体...

小编辑
2011/07/19
781
2
fastjson 发布 1.1.1 版本,性能大幅提升

之前的一个版本是1.1.0,1.1.0采用asm和SortFastMatch算法提高性能,由于过于着急展示其优越的性能,没有进行严格测试就发布了。 1.1.1相对于1.1.0,这是一个比较稳定的版本了,行测试覆盖率...

wenshao
2011/07/24
3.1K
12
FastJson---高性能JSON开发包

Fastjson介绍 Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发。 1、遵循http://json.org标准,为其官方网站收录的参考实现之一。 2、功能qiang打,支持JDK的各种类型,包括基本...

Zero零_度
2015/11/13
468
0
Fastjson 技术内幕

文章来源:http://code.alibabatech.com/wiki/display/FastJSON/Inside+Fastjson JSON协议使用方便,越来越流行。JSON的处理器有很多,为什么需要再写一个呢?因为我们需要一个性能很好的JSO...

鉴客
2011/08/08
4.1K
17
fastjson-1.2.11 发布,Bug 修复,性能提升

fastjson-1.2.11 发布,Bug修复,性能提升,BeanToArray模式性能超越probuf。 Bug 修复 修复在某些场景下,List字段序列化后结果不对的问题。这问题因1.2.10优化引起,在此版本1.2.11中修复。...

oschina
2016/05/03
3.3K
33

没有更多内容

加载失败,请刷新页面

加载更多

关于运维,该怎么决定它的方向,这个似工作又似兴趣的存在

我之前主要从事网络、桌面、机房管理等相关工作,这些工作使我迷惘,这应该是大多数运维人都经历过的过程; 18年国庆,我从国内前三的消费金融公司裸辞,下海创业,就是想要摆脱这样的困境。...

网络小虾米
3分钟前
1
0
Java Timer的用法

Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { System.out.println("11232"); } }, 200000 , 1000); public void schedule(TimerTask task, long delay......

林词
7分钟前
3
0
使用js动态加载外部js文件以及动态创建script脚本

动态脚本指的是在页面加载时不存在,但将来的某一时刻通过修改该DOM动态添加的脚本。和操作HTML元素一样,创建动态脚本也有两种方式:插入外部文件和直接插入JavaScript代码。 动态加载外的外...

Bing309
14分钟前
2
0
从零开始入门 K8s | Kubernetes 网络概念及策略控制

作者 | 阿里巴巴高级技术专家 叶磊 一、Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法。大家知道 Kubernetes 对于网络具体实现方案,没有什么限制,也没有给出特...

阿里巴巴云原生
19分钟前
2
0
天气获取

本文转载于:专业的前端网站➨天气获取 $.get("http://wthrcdn.etouch.cn/WeatherApi", { citykey: cityCode }, function (d) { //创建文档对象 var parser = new ......

前端老手
19分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部