MessagePack、Kryo、Protocol Buffersなどのシリアライザーのパフォーマンス比較

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プロセッサです。さっと走らせただけなので、厳密性を求める場合は実行予定の環境で試すのが良いです。
total
size

$ ./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より遅くて何が原因なのか掴み切れておりません。

コメント

  1. […] MessagePack、Kryo、Protocol Buffersなどのシリアライザーのパフォーマンス比較 […]

  2. […] 「MessagePack、Kryo、Protocol Buffersなどのシリアライザーのパフォーマンス比較」と同じく、MacBook Pro Retina 13-inch(2.4GHzデュアルコアIntel Core i5プロセッサ)で実行しました。 […]

タイトルとURLをコピーしました