jvm-serializers提供了一个很好的比较各种Java序列化的的测试套件。 它罗列了各种序列化框架, 可以自动生成测试报告。
我在AWS c3.xlarge机器上进行了测试,一下是测试报告与解析。
关键的测试数据的统计代码如下:
|
|
测试时序列化和反序列化会迭代多次,默认2000次。 测试会有一个限定时间,一轮测试完成后时间还有的话还会继续新的一轮的测试。 因此, 由于不同的框架花费的时间不同, 测试的轮数也不一样。
测试平台
OS:Linux (CentOS 6.4)
JVM:JDK 1.7.0_17
CPU: c3.xlarge
Cores (incl HT):4
免责声明
本测试主要关注无循环引用的数据结构, 但是如此众多的序列化框架还是各有不同:
- 有些支持循环引用检测
- 有些会输出全部的元数据,有些不会
- 有些支持跨平台,有些只支持特定的编程语言
- 有些是基于文本的,有些却基于二进制
- 有些支持向前向后兼容, 有些只支持向前或者向后,有些全部不支持
(查看ToolBehavior页面以了解一些框架的特性)
尽管别的测试数据可能会生成不同的测试结果(例如在每个字符串中增加非ascii字符), 此测试还是会提供一个各个序列化框架的性能的原始估计。
序列化框架Serializers(无共享引用)
- 无循环引用。 一个对象如果被引用两次则会序列化两次
- 没有手工优化
- schema预先已知
Ser Time+Deser Time (ns)
Ser Time+Deser Time (ns)
Size, Compressed in bytes
Size, Compressed in bytes
|
|
全对象图序列化框架Full Object Graph Serializers
- 支持全部的object graph读写. Object graph可能包含循环引用.
- 无预先处理, 没有预先的类生成,注册. 所有都运行时产生, 比如使用反射.
- 注意通常不会跨编程语言。 然而JSON/XML格式由于其特殊性可以跨语言.
Ser Time+Deser Time (ns)
Ser Time+Deser Time (ns)
Size, Compressed [light] in bytes
Size, Compressed in bytes
|
|
跨语言二进制序列化框架cross Lang Binary Serializers
- 无循环引用
- schema预先已知
Ser Time+Deser Time (ns)
Ser Time+Deser Time (ns)
Size, Compressed in bytes
Size, Compressed in bytes
|
|
XML/JSon序列化框架
- 基于文本
- Mixed regarding required preparation, object graph awareness (references).
Ser Time+Deser Time (ns)
Ser Time+Deser Time (ns)
Size, Compressed in bytes
Size, Compressed in bytes
|
|
手工优化的序列化框架Manually optimized Serializers
Ser Time+Deser Time (ns)
Ser Time+Deser Time (ns)
Size, Compressed in bytes
Size, Compressed in bytes
|
|
特性对性能的影响Cost of features
shows performance vs convenience of manually-selected libs.
- 循环引用, schema预知,手工优化cycle free, schema known at compile time, manual optimization: kryo-manual, msgpack-manual
- 循环引用, schema预知cycle free, schema known at compile time: protostuff, fst-flat-pre, kryo-flat-pre. (note: protostuff uses class generation while the other two just require a list of classes to be written)
- 循环引用, schema编译时未知 cycle free, schema UNKNOWN at compile time: fst-flat, kryo-flat, protostuff-runtime, msgpack-databind
- 全图读写,schema编译时未知 full object graph awareness, schema UNKNOWN at compile time: fst, kryo.
Ser Time+Deser Time (ns)
Ser Time+Deser Time (ns)
Size, Compressed in bytes
Size, Compressed in bytes
|
|
全部的测试结果
|
|
|
|
本文通过在AWS c3.xlarge实例上进行测试,对比了多种Java序列化框架的性能。测试包括无循环引用、全对象图序列化、跨语言二进制序列化等多个方面,并分析了不同特性的成本。
1085

被折叠的 条评论
为什么被折叠?



