測試平臺
- 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 |