译文:序列化方案的性能比较。

测试平台

  • OS:Mac OS X
  • JVM:Oracle Corporation 1.8.0_91
  • CPU:2.8 GHz Intel Core i7 os-arch:Darwin Kernel Version 15.5.0
  • Cores (incl HT):8

免责声明

此测试的重点是对无周期数据结构的编码/解码,但是所比较的库的功能集差异很大:

  • 一些序列化程序支持循环检测/对象共享,其他则只编写非循环树结构
  • 有些在序列化输出中包含完整的元数据,有些则没有
  • 有些是跨平台的,有些是特定于语言的
  • 有些是基于文本的,有些是二进制的,
  • 有些支持向前/向后版本控制,两者都支持

其他测试数据会产生不同的结果(例如,在每个字符串中添加非ASCII字符:-))。 但是,结果给出了库性能的原始估计。

序列化器(无共享引用)

基准序列化器

  • 仅循环自由树结构。 被引用两次的对象将被序列化两次。
  • 没有手动优化。
  • 模式是事先已知的(预注册甚至是类生成)。 (并非所有人都可以利用这一点)

序列化时间+ 反序列化时间(ns)

大小,压缩大小[light]以字节为单位

 createserdesertotalsizedfl
colfer49248396643238148
protostuff684336341067239150
minified-json/dsl-platform464326841116353197
fst-flat-pre535016751175251165
json/dsl-platform445268061332485261
json-array/fastjson/databind536506961345281163
kryo-flat-pre545977581355212132
smile-col/jackson/databind5472310821805252165
msgpack/databind5479610521848233146
cbor-col/jackson/databind5473211471879251165
protobuf12111737191891239149
smile/jacksonafterburner/databind5491311752088352252
thrift-compact9712808082088240148
cbor/jackson+afterburner/databind5388812392126397246
flatbuffers5614177582175432226
thrift9514557312186349197
json-col/jackson/databind5388713292216293178
json/fastjson/databind53105812412299486262
smile/jackson/databind53101113002311338241
scala/sbinary442131110692381255147
capnproto5515749792553400204
json/jackson+afterburner/databind52109414892584485261
json/jackson/databind53102315612585397246
json/protostuff-runtime54135316322986469243
json/jackson/databind54116418663030485261
json/jackson-jr/databind53142619623389468255
xml/jackson/databind54263947207359683286
json/gson/databind56466744039070486259
bson/jackson/databind54410554499554506286
xml/xstream+c524383943413817487244
json/javax-tree/glassfish124968181028417102485263
xml/exi-manual5411375989121266337327
java-built-in5350462327928325889514
scala/java-built-in514828036105443851293698
json/protobuf12366305678763417488253
json/json-lib/databind61198537196991822485263

完整对象图序列化器

包含序列化器(配置)

  • 支持完整的对象图写/读。对象图可能包含循环。如果一个对象被引用两次,那么在反序列化之后也会如此。
  • 没有预先知道的东西,没有类生成,没有预先注册的类。所有的东西都是在运行时用反射来捕获的。
  • 注意,这通常不能跨语言使用,但是JSON/XML格式可能支持跨语言反序列化。

序列化时间+ 反序列化时间(ns)

大小,压缩大小[light]以字节为单位

 createserdesertotalsize+dfl
protostuff-graph706917501441239150
protostuff-graph-runtime607727991571241151
kryo-serializer53148013312810286188
fst53151113182830316203
jboss-marshalling-river-ct54247017534223298199
hessian54284246227464501313
jboss-serialization615547589411441932582
xml/JAXB/aalto554404941813822702318
jboss-marshalling-river5335382002523563694400
jboss-marshalling-serial5485241917827702856498
stephenerialization56559523143287391093515
json/flexjson/databind53108691850729376503273
java-built-in-serializer5555012626331764889514
yaml/jackson/databind53171632543642599505260
xml/JAXB544354141333145686719329

Cross Lang二进制序列化器

包含序列化器(配置)

  • 仅循环自由树结构。 被引用两次的对象将被序列化两次。
  • 模式是预先已知的(预注册,中间消息描述语言,类生成)。

序列化时间+ 反序列化时间(ns)

大小,压缩大小[light]以字节为单位

 createserdesertotalsize+dfl
colfer49248396643238148
protobuf/protostuff634616331094239149
protobuf/protostuff-runtime525187011218241150
msgpack/databind5479610521848233146
protobuf12111737191891239149
thrift-compact9712808082088240148
flatbuffers5614177582175432226
thrift9514557312186349197
capnproto5515749792553400204
cbor/jackson/databind53102315612585397246
hessian54284246227464501313
bson/jackson/databind54410554499554506286

XML / JSon序列化器

  • 基于文本格式。 通常任何人都可以阅读。 数据中经常内联架构。
  • 关于所需的准备,对对象图的了解(参考)混合在一起。

序列化时间+ 反序列化时间(ns)

大小,压缩大小[light]以字节为单位

 createserdesertotalsizedfl
minified-json/dsl-platform464326841116353197
json/dsl-platform445268061332485261
json-array/fastjson/databind536506961345281163
smile-col/jackson/databind5472310821805252165
cbor-col/jackson/databind5473211471879251165
json-col/jackson/databind5388713292216293178
json/fastjson/databind53105812412299486262
json/protostuff-runtime54135316322986469243
json/jackson/databind54116418663030485261
json/jackson-jr/databind53142619623389468255
xml/jackson/databind54263947207359683286
json/gson/databind56466744039070486259
xml/xstreamc524383943413817487244
xml/JAXB/aalto554404941813822702318
json/javax-tree/glassfish124968181028417102485263
xml/exi-manual5411375989121266337327
json/flexjson/databind53108691850729376503273
yaml/jackson/databind53171632543642599505260
json/protobuf12366305678763417488253
yaml/jackson/databind61198537196991822485263
xml/JAXB544354141333145686719329

手动优化的序列化器

各种手动优化的序列化器。 手工编码并硬连线到基准的消息结构。

  • 说明了可能的情况,在何种情况下可以优化通用方法

序列化时间+ 反序列化时间(ns)

大小,压缩大小[light]以字节为单位

 createserdesertotalsizedfl
kryo-manual54462524986211131
protostuff-manual584066601065239150
datakernel605715061077225133
kryo-opt535106171127209129
wobly386995251224251151
wobly-compact377215371258225139
java-manual537296361365255147
smile/jackson/manual538049691773341244
msgpack/manual5381910731893233146
cbor/jackson/manual5287810751954386238
json/jackson/manual52103912282267468253
jboss-marshalling-river-ct-manual5313159792294289167
avro-generic32917219842704221133
json/protostuff-manual53128715812868449233
avro-specific78179512293024221133
xml/aalto-manual52171424264140653304
xml/woodstox-manual62216335315693653304
jboss-marshalling-river-manual54151646076123483240
json/gson/manual53293636416577468253
json/json-smart/manual-tree53449934307930495265
xml/javolution/manual52380357559558504263
xml/xstreamc-aalto543310673210042525273
json/gson/manual-tree564836547110307485259
xml/fastinfo-manual536326414410470377284
xml/xstream+c-fastinfo535699524610944345264
bson/mongodb/manual562764821510979495278
xml/xstream+c-woodstox543937741011347525273
json/org.json/manual-tree535468690412372485259
json/json.simple/manual535627758613213495265
json/javax-stream/glassfish544821899213813468253
json/svenson/databind5439461164015586495267
json/jsonij/manual-jpath5320047972629773478257
json/argo/manual-tree53560731253968612485263

功能成本

显示性能VS手动选择的库的便利性。

  • 无周期,编译时已知的模式,手动优化:kryo-manual,msgpack / manual
  • 无周期,在编译时已知的模式:proststuff,fst-flat-pre,kryo-flat-pre。 (注意:protostuff使用类生成,而其他两个只需要编写一个类列表)
  • 无周期,模式在编译时未知:fst-flat,kryo-flat,protostuff-runtime,msgpack / databind
  • 全对象图感知,在编译时未知的架构:fst,kryo。

序列化时间+ 反序列化时间(ns)

大小,压缩大小[light]以字节为单位

 createserdesertotalsize+dfl
kryo-manual54462524986211131
protostuff684336341067239150
fst-flat-pre535016751175251165
protostuff-runtime705227271249241151
kryo-flat-pre545977581355212132
kryo-flat537059091614268177
msgpack/databind5479610521848233146
fst-flat5380410881892314204
msgpack/manual5381910731893233146
kryo-serializer53148013312810286188
fst53151113182830316203

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值