序列化套路Jackson和Protobuff
Performance testing between Jackson and Protobuff.
1. Jackson和Protobuff哪个更加高效?
(1)我们直接使用现有的ProtoStuffSerializer类和Jackson2JsonRedisSerializer来测试Jackson和Protobuff的序列化效率,这2个类并没有做任何多余动作,不会影响测试的不变条件。这里ProtoStuffSerializer类需要额外扩展一个反序列化方法。

(2)序列化测试的3种类型如下。
/**
* 描述: 测试int类型
*
* @author linfengda
* @create 2018-10-04 12:30
*/
@Data
public class IntClazz {
private int target;
public IntClazz() {
this.target = 123456789;
}
}
......
/**
* 描述: 测试double类型
*
* @author linfengda
* @create 2018-10-04 12:29
*/
@Data
public class DoubleClazz {
private double target;
public DoubleClazz() {
this.target = 123456789.123456789;
}
}
......
/**
* 描述: 测试String类型
*
* @author linfengda
* @create 2018-10-06 22:25
*/
public class StringClazz {
private String target;
public StringClazz() {
this.target = "123456789.123456789";
}
}
(3)序列化测试场景为:一定数量的拥有相同字段类型的相同实例,使用不同方式序列化的耗时。

(4)反序列化测试场景为:一定数量的拥有相同字段类型的相同实例,使用不同方式反序列化的耗时。

(5)对于一种测试类型,我们的不变性条件为实例类型+测试次数,唯一变量为序列化方式,其中测试入口如下:

(6)序列化测试:其中第一次的10^2次代码运行为了排除jvm优化和代码优化生效的影响,真正的测试次数为10^3,10^4,10^5,10^6:

(7)我们分别测试了整形/双精度浮点型/字符串类型的序列化和反序列化耗时,并将测试结果整理成下图的echart柱状图。其中图表的横坐标为序列化次数(10^n次),纵坐标为Protobuff或Jackson的序列化耗时。
1. 整形
2. 双精度浮点型
3. 字符串类型
实验结论简单粗暴,我直接告诉你:Protobuff的序列化速度比Jackson快,Jackson的反序列化速度比Protobuff快。