2019独角兽企业重金招聘Python工程师标准>>>
偶然间看到的阿里出品的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 users = new ArrayList();
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 strs = new ArrayList();
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。