Protocol Buffer、Thrift、Avro、MessagePack for Javaのパフォーマンス測定

@frsyukiさんの作っているMessagePackのJava版が出ていたので軽くパフォーマンス測定してみました。

パフォーマンス測定に使ったプロジェクトは、TPC(Thrift-ProtocolBuffer-Compare)です。TPCシリアライズ、デシリアライズテクノロジを色々とベンチマークして、かつ最後にGoogleChartでグラフを出してくれる賢いやつです。GJ、TPC。ちなみに今回の測定のやつは、自前でAMF用作ったり、ややカスタマイズしてます。


測定は、イテレーション数を500、1000、2000回でそれぞれ測定しました。測定結果及びまとめは私の主観なので、そこは各自測定して、各々判断されるのがベストと思います。何かの参考になれば程度に考えてください。


環境

結論

  • avroは全体的に高パフォーマンスだが、生成コストが非常に高い
  • messagepackはかなり早い、Totalで考えると、avro、Protocol Buffer、Thriftなどとほぼ同等
  • 誤差の範囲内の可能性もあるが、AvroとProtocolBufferはデシリアライズの安定度がある可能性アリ
  • jsonも意外とわるくないパフォーマンスを出している
  • XStreamとHessianが遅すぎる...(が、これは何か使い方等間違いがあるんじゃないかと疑惑。。。)
  • javaのシリアライゼーションも遅いほうに入る

全てナノタイム計算なので、上位五位くらいまではほぼ誤差の範囲内で問題ないと思います。というわけで、MessagePack for Javaも相当早い部類にはいります。


課題としては、以下の点があります。

  • このパフォーマンス測定で使ったオブジェクトは比較的シンプルなPOJOなのでその複雑度に対しては評価が必要
  • メモリ使用量/CPU使用量など負荷感に関しては特に観測データがない
  • OSによる精度差が十分考えられる
  • 開発容易性などの観点が無い(IDL形式か、など)



以下、測定結果です。



見方

timeCreate : オブジェクト生成

timeSer : シリアライズコスト(オブジェクト生成コストは含まない)

timeDser : デシリアライズコスト

totalTime : オブジェクト生成コスト、シリアライズとデシリアライズ含む全てのコスト

length : シリアライズ後のオブジェクトサイズ