Javaで、オブジェクトをシリアライズするのに、どの仕様と実装が良いのかを調査しています。
特にパフォーマンスを気にしない時は、「JSON一択」だと思っているのですが、パフォーマンスが気になる用途では、変換時間とサイズが気になってしまいます。
thrift-protobuf-compareというベンチマーク
調べてみると、thrift-protobuf-compareというベンチマークがありました。thriftもbrotobufもシリアライザーのひとつなのですが、これだけではなく他のシリアライザーも比較しています。
eishay/jvm-serializers Wiki
GitHubからリポジトリをcloneして、自分のマシンでもベンチマークをすることができます。
走らせてみた。
僕のMacBook Pro Retina 13-inchでも試してみました。2.4GHzデュアルコアIntel Core i5プロセッサです。さっと走らせただけなので、厳密性を求める場合は実行予定の環境で試すのが良いです。
$ ./run -chart -include=`cat serializers.txt | tr "\\n" ","` data/media.1.cks
# ...(略)...
pre. create ser deser total size +dfl
java-built-in 81 7977 44080 52057 889 514
java-manual 83 1145 832 1977 255 147
hessian 83 5342 8088 13430 501 313
kryo 82 1053 1054 2107 214 134
kryo-opt 82 1115 1123 2238 211 131
kryo-manual 83 735 841 1576 211 131
wobly 54 1221 742 1963 251 151
wobly-compact 54 1246 778 2024 225 139
jboss-serialization 81 9597 8985 18582 932 582
jboss-marshalling-river 81 6224 40621 46845 694 400
jboss-marshalling-river-manual 82 3224 7083 10306 483 240
jboss-marshalling-river-ct 81 4277 3012 7289 298 199
jboss-marshalling-river-ct-manual 81 2553 1629 4182 289 167
jboss-marshalling-serial 82 16899 44136 61035 856 498
protobuf 140 1716 966 2681 239 149
protostuff 114 687 895 1582 239 150
protostuff-manual 81 667 920 1587 239 150
protostuff-runtime 81 982 1242 2224 241 151
protobuf/protostuff 111 779 923 1702 239 149
thrift 144 2341 1117 3458 349 197
thrift-compact 143 2075 1230 3304 240 148
avro 124 2244 2003 4247 221 133
avro-generic 546 2610 1587 4196 221 133
msgpack 82 1165 1793 2958 233 146
json/protostuff-manual 83 1792 2442 4234 449 233
json/protostuff-runtime 78 2177 2914 5091 469 243
json/svenson-databind 82 5726 14694 20420 495 271
json/flexjson/databind 81 31540 38683 70222 503 273
json/json-lib-databind 81 34020 152738 186758 485 263
json/json.simple/manual 82 8053 11557 19610 495 269
json/json-smart/manual/tree 82 6957 5074 12031 495 269
json/org.json/manual/tree 82 8983 10955 19938 485 259
json/jsonij-jpath 81 62570 15406 77976 478 254
json/argo-manual/tree 81 88644 19366 108009 485 263
bson/mongodb 81 4752 9135 13887 495 278
xml/xstream+c 81 7654 16824 24478 487 244
xml/xstream+c-woodstox 81 7465 16689 24153 525 273
xml/xstream+c-aalto 82 6629 15078 21707 525 273
xml/xstream+c-fastinfo 82 12121 11906 24026 345 264
xml/javolution 82 7421 11622 19042 504 263
# ...(略)...
MessagePack、Kryo、 Protocol Buffersが気になる。
調べた結果、3つくらい気になるのが出てきました。
MessagePack
Kryo
Protocol Buffers
シリアライザーにも色々な性質があるんですね。みんな全然違います。
今回調べているのは、「事前にシリアライズ済みのデータをネットワーク転送してデシリアライズしたい」という用途なので、サイズが小さくデシリアライズが早いものがほしいのですが、今のところどれがいいのか決めきれていません。
オブジェクトにフィールドを追加しても簡単にデシリアライズできてほしいので、MessagePackが良さそうなんですが、Javaライブラリで試してみたら、なぜかJSONより遅くて何が原因なのか掴み切れておりません。
コメント
[…] MessagePack、Kryo、Protocol Buffersなどのシリアライザーのパフォーマンス比較 […]
[…] 「MessagePack、Kryo、Protocol Buffersなどのシリアライザーのパフォーマンス比較」と同じく、MacBook Pro Retina 13-inch(2.4GHzデュアルコアIntel Core i5プロセッサ)で実行しました。 […]