Windows Phoneにおける高速なシリアライズについて。

多数のオブジェクトや複雑なオブジェクトをシリアライズ・デシリアライズする際は、パフォーマンスがネックとなります。デシリアライズ処理が速く終わればそれだけ速く操作可能になり、より良好なUXを提供できます。シリアライズ処理が長引くと10秒ルールに引っかかる恐れがあります。というわけで、WPで利用可能な(比較的)高速なシリアライズ手法について。

ただし、今回は時間の計測を行っていません、データどこかにやってしまった。。

see also: neue cc – .NET(C#)におけるシリアライザのパフォーマンス比較 http://neue.cc/2010/05/29_261.html

DataContractSerializer

まず何をするにも比較対象が必要なので、DataContractSerializerを起点に考えましょう。

DataContractSerializerのメリットは何と言っても扱いやすいこと。デフォルトで入ってますので、あと変な型じゃなければだいたいシリアライズできます。

逆にデメリットはファイルサイズが膨らむこと。ファイルを読むことだって時間が必要ですので、それだけパフォーマンスが悪化するんじゃないか、ということです。具体的なところは知らないのでCPUの方がネックになったりするかもしれません。バイナリ化すれば改善する様子。ちなみに、DataContractJsonSerializerはファイルサイズ縮むらしいですが、DCSよりも遅かったりします。

Protobuf-net

高速で、サイズも抑えられるシリアライザ。ベータ版を使えばWPでも動きます。もともとProtocol Bufferはデータ転送のためのシリアライズですが、まぁ、普通にシリアライザとして使うと。

メリットはDCSより速いことです。あと、ファイルサイズも縮みます。

デメリットはアノテーションが若干面倒なこと。シリアライズしたい全てのメンバに [ProtoMember(ID)]を振らないとダメです。IDはint n ∈ N です。

自前

ある境地に辿りついた結果です。そうか、自前でシリアライズすればいいんだ!( ピコーン

メリットはとにかく速い事です。リフレクションとか使わずにひたすら真っ当にシリアライズするのでオーバーヘッドは無いに等しいです。

デメリットは、もうわかりますよね。めっちゃ面倒です。泣きます。

自前シリアライズについては このへん を見ると良いと思います。

なんにせよ

速けりゃいいってもんでもなく、実装コストがちゃんとメリットと見合うかどうかを考えた方がいいってもんでしょう。

WP7のパフォーマンスを上げるのつらいですね。がんばります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です