譯文:序列化方案的性能比較。

測試平臺

  • 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

 

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