测试方法: 对一个含16个Integer/String/Date类型字段的扁平对象作序列化/反序列化,单机多线程循环执行,用循环一定次数之后sleep(1)控制频率,每隔1秒统计一次执行次数,并观察CPU/LOAD/内存等指标(因内存恒定开销,忽略掉)。
测试环境:4 x Xeon E5520 2.27GHz, 7.3GB 虚拟机
测试结果:
一、采用java内置序列化:
tps(w) | thread | cpu(%) | load |
8.9 | 1 | 22.3 | 0.8 |
15.5 | 2 | 46.3 | 1.64 |
21 | 3 | 69.7 | 2.88 |
23 | 4 | 88.5 | 3.5 |
20.5 | 5 | 70 | 4.2 |
19.5 | 6 | 71 | 5 |
20 | 7 | 67 | 6.28 |
20.5 | 8 | 64 | 6.5 |
20.5 | 40 | 70 | 7.5 |
JAVA内置反序列化:
tpc(w) | thread | cpu(%) | load |
2 | 1 | 24.6 | 1.1 |
3.85 | 2 | 49 | 1.9 |
5.8 | 3 | 72 | 2.8 |
7.65 | 4 | 96.6 | 4 |
7.6 | 5 | 96.8 | 4.5 |
7.6 | 6 | 96.9 | 6.3 |
7.6 | 7 | 97.1 | 7.2 |
7.6 | 8 | 98 | 9 |
7.6 | 40 | 97 | 14.5 |
二 protostuff序列化
tpc(w) | thread | cpu(%) | load |
54 | 1 | 9.8 | 1 |
105 | 2 | 22 | 0.8 |
150 | 3 | 41 | 1.8 |
190 | 4 | 52 | 2.44 |
180 | 5 | 66 | 3.6 |
200 | 6 | 76 | 5 |
240 | 7 | 85.7 | 5.1 |
250 | 8 | 94.3 | 5.3 |
270 | 40 | 99 | 17 |
protostuff反序列化
tpc(w) | thread | cpu(%) | load |
38 | 1 | 11 | 0.9 |
71 | 2 | 28.7 | 1.6 |
97 | 3 | 49 | 1.9 |
142 | 4 | 57.7 | 2.5 |
150 | 5 | 65 | 3.7 |
160 | 6 | 73 | 4.6 |
170 | 7 | 81 | 6.8 |
177 | 8 | 89 | 6.5 |
175 | 40 | 93 | 10.5 |
小结论:
1、线程数接近CPU核数能达到最好性能
2、java/protostuff序列化比反序列化性能都要好2倍左右
3、java序列化性能不理想,cpu跑满,也就10w左右,protostuff跟它完全不是一个量级,可以达到200w以上
相关推荐:
https://github.com/eishay/jvm-serializers/wiki (各种序列化对比测试,生成报表)