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

测试平台

  • 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]以字节为单位

  create ser deser total size dfl
colfer 49 248 396 643 238 148
protostuff 68 433 634 1067 239 150
minified-json/dsl-platform 46 432 684 1116 353 197
fst-flat-pre 53 501 675 1175 251 165
json/dsl-platform 44 526 806 1332 485 261
json-array/fastjson/databind 53 650 696 1345 281 163
kryo-flat-pre 54 597 758 1355 212 132
smile-col/jackson/databind 54 723 1082 1805 252 165
msgpack/databind 54 796 1052 1848 233 146
cbor-col/jackson/databind 54 732 1147 1879 251 165
protobuf 121 1173 719 1891 239 149
smile/jacksonafterburner/databind 54 913 1175 2088 352 252
thrift-compact 97 1280 808 2088 240 148
cbor/jackson+afterburner/databind 53 888 1239 2126 397 246
flatbuffers 56 1417 758 2175 432 226
thrift 95 1455 731 2186 349 197
json-col/jackson/databind 53 887 1329 2216 293 178
json/fastjson/databind 53 1058 1241 2299 486 262
smile/jackson/databind 53 1011 1300 2311 338 241
scala/sbinary 442 1311 1069 2381 255 147
capnproto 55 1574 979 2553 400 204
json/jackson+afterburner/databind 52 1094 1489 2584 485 261
json/jackson/databind 53 1023 1561 2585 397 246
json/protostuff-runtime 54 1353 1632 2986 469 243
json/jackson/databind 54 1164 1866 3030 485 261
json/jackson-jr/databind 53 1426 1962 3389 468 255
xml/jackson/databind 54 2639 4720 7359 683 286
json/gson/databind 56 4667 4403 9070 486 259
bson/jackson/databind 54 4105 5449 9554 506 286
xml/xstream+c 52 4383 9434 13817 487 244
json/javax-tree/glassfish 1249 6818 10284 17102 485 263
xml/exi-manual 54 11375 9891 21266 337 327
java-built-in 53 5046 23279 28325 889 514
scala/java-built-in 514 8280 36105 44385 1293 698
json/protobuf 123 6630 56787 63417 488 253
json/json-lib/databind 61 19853 71969 91822 485 263

完整对象图序列化器

包含序列化器(配置)

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

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

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

  create ser deser total size +dfl
protostuff-graph 70 691 750 1441 239 150
protostuff-graph-runtime 60 772 799 1571 241 151
kryo-serializer 53 1480 1331 2810 286 188
fst 53 1511 1318 2830 316 203
jboss-marshalling-river-ct 54 2470 1753 4223 298 199
hessian 54 2842 4622 7464 501 313
jboss-serialization 61 5547 5894 11441 932 582
xml/JAXB/aalto 55 4404 9418 13822 702 318
jboss-marshalling-river 53 3538 20025 23563 694 400
jboss-marshalling-serial 54 8524 19178 27702 856 498
stephenerialization 56 5595 23143 28739 1093 515
json/flexjson/databind 53 10869 18507 29376 503 273
java-built-in-serializer 55 5501 26263 31764 889 514
yaml/jackson/databind 53 17163 25436 42599 505 260
xml/JAXB 54 4354 141333 145686 719 329

Cross Lang二进制序列化器

包含序列化器(配置)

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

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

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

  create ser deser total size +dfl
colfer 49 248 396 643 238 148
protobuf/protostuff 63 461 633 1094 239 149
protobuf/protostuff-runtime 52 518 701 1218 241 150
msgpack/databind 54 796 1052 1848 233 146
protobuf 121 1173 719 1891 239 149
thrift-compact 97 1280 808 2088 240 148
flatbuffers 56 1417 758 2175 432 226
thrift 95 1455 731 2186 349 197
capnproto 55 1574 979 2553 400 204
cbor/jackson/databind 53 1023 1561 2585 397 246
hessian 54 2842 4622 7464 501 313
bson/jackson/databind 54 4105 5449 9554 506 286

XML / JSon序列化器

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

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

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

  create ser deser total size dfl
minified-json/dsl-platform 46 432 684 1116 353 197
json/dsl-platform 44 526 806 1332 485 261
json-array/fastjson/databind 53 650 696 1345 281 163
smile-col/jackson/databind 54 723 1082 1805 252 165
cbor-col/jackson/databind 54 732 1147 1879 251 165
json-col/jackson/databind 53 887 1329 2216 293 178
json/fastjson/databind 53 1058 1241 2299 486 262
json/protostuff-runtime 54 1353 1632 2986 469 243
json/jackson/databind 54 1164 1866 3030 485 261
json/jackson-jr/databind 53 1426 1962 3389 468 255
xml/jackson/databind 54 2639 4720 7359 683 286
json/gson/databind 56 4667 4403 9070 486 259
xml/xstreamc 52 4383 9434 13817 487 244
xml/JAXB/aalto 55 4404 9418 13822 702 318
json/javax-tree/glassfish 1249 6818 10284 17102 485 263
xml/exi-manual 54 11375 9891 21266 337 327
json/flexjson/databind 53 10869 18507 29376 503 273
yaml/jackson/databind 53 17163 25436 42599 505 260
json/protobuf 123 6630 56787 63417 488 253
yaml/jackson/databind 61 19853 71969 91822 485 263
xml/JAXB 54 4354 141333 145686 719 329

手动优化的序列化器

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

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

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

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

  create ser deser total size dfl
kryo-manual 54 462 524 986 211 131
protostuff-manual 58 406 660 1065 239 150
datakernel 60 571 506 1077 225 133
kryo-opt 53 510 617 1127 209 129
wobly 38 699 525 1224 251 151
wobly-compact 37 721 537 1258 225 139
java-manual 53 729 636 1365 255 147
smile/jackson/manual 53 804 969 1773 341 244
msgpack/manual 53 819 1073 1893 233 146
cbor/jackson/manual 52 878 1075 1954 386 238
json/jackson/manual 52 1039 1228 2267 468 253
jboss-marshalling-river-ct-manual 53 1315 979 2294 289 167
avro-generic 329 1721 984 2704 221 133
json/protostuff-manual 53 1287 1581 2868 449 233
avro-specific 78 1795 1229 3024 221 133
xml/aalto-manual 52 1714 2426 4140 653 304
xml/woodstox-manual 62 2163 3531 5693 653 304
jboss-marshalling-river-manual 54 1516 4607 6123 483 240
json/gson/manual 53 2936 3641 6577 468 253
json/json-smart/manual-tree 53 4499 3430 7930 495 265
xml/javolution/manual 52 3803 5755 9558 504 263
xml/xstreamc-aalto 54 3310 6732 10042 525 273
json/gson/manual-tree 56 4836 5471 10307 485 259
xml/fastinfo-manual 53 6326 4144 10470 377 284
xml/xstream+c-fastinfo 53 5699 5246 10944 345 264
bson/mongodb/manual 56 2764 8215 10979 495 278
xml/xstream+c-woodstox 54 3937 7410 11347 525 273
json/org.json/manual-tree 53 5468 6904 12372 485 259
json/json.simple/manual 53 5627 7586 13213 495 265
json/javax-stream/glassfish 54 4821 8992 13813 468 253
json/svenson/databind 54 3946 11640 15586 495 267
json/jsonij/manual-jpath 53 20047 9726 29773 478 257
json/argo/manual-tree 53 56073 12539 68612 485 263

功能成本

显示性能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]以字节为单位

  create ser deser total size +dfl
kryo-manual 54 462 524 986 211 131
protostuff 68 433 634 1067 239 150
fst-flat-pre 53 501 675 1175 251 165
protostuff-runtime 70 522 727 1249 241 151
kryo-flat-pre 54 597 758 1355 212 132
kryo-flat 53 705 909 1614 268 177
msgpack/databind 54 796 1052 1848 233 146
fst-flat 53 804 1088 1892 314 204
msgpack/manual 53 819 1073 1893 233 146
kryo-serializer 53 1480 1331 2810 286 188
fst 53 1511 1318 2830 316 203

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章