译文:序列化方案的性能比较。
测试平台
- 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 |