内容
ZeroFormatterにUnion機能が実装されたため
前回をもとにUnionで再実装してテストをする。
業界主要なデータフォーマットのJsonとの比較がないとパッとしないだろうということで
Unityの標準Jsonクラスを使用してテストしてみました。
テスト内容はFlatbuffersとの比較処理で使用したものをそのまま使う。
(http://qiita.com/akerusoft/items/bf43b6382f30c43595b4)
使用したプログラム
https://github.com/akerusoft/UnityTestZeroFormatter2
環境
Unity 5.4.2p4
ZeroFormatter 1.4.2
IL2CPPでビルド
Android 4.0.4 (低スペック機)
結果
一般的なデータフォーマットとの比較としてJsonUtilityも追加してみました。
シリアライズとデシリアライズを1000回、それぞれのフォーマットで実行した結果です。
JsonUtility | ZeroFormatter | FlatBuffers | |
---|---|---|---|
1 | 1,298 | 458 | 489 |
2 | 1,292 | 459 | 538 |
3 | 1,273 | 510 | 524 |
4 | 1,292 | 508 | 479 |
5 | 1,270 | 439 | 519 |
6 | 1,280 | 444 | 477 |
7 | 1,256 | 475 | 478 |
8 | 1,276 | 468 | 510 |
9 | 1,275 | 458 | 507 |
10 | 1,201 | 434 | 466 |
Average | 1,271.3 | 465.3 | 498.7 |
Max | 1,298.0 | 510.0 | 538.0 |
Min | 1,201.0 | 434.0 | 466.0 |
JsonUtilityとの比較 | |||
Average | 1.00 | 0.37 | 0.39 |
Max | 1.00 | 0.39 | 0.41 |
Min | 1.00 | 0.36 | 0.39 |
データサイズ | 96 | 65 | 84 |
FlatBuffersとZeroFormatterは、ほぼほぼ一緒ですね。
もうこれ以上、速くするにはデータによって最適化されたフォーマットなどではないでしょうか?
JsonUtilityは速度面ではなく柔軟性の高さが売りですので
この結果だから使用しないというわけではなく、速度を気にしない箇所では使っても問題ないと思います。
注意点
フィールドの追加
ZeroFormatterはフィールドの追加や削除はできるので
ここでの実装のようにバージョンを分けるのは「大きな変更があってリセットしたい」ってとき。
ZeroFormatterでUnionを使用するときの注意点
シリアライズするときに親クラスを指定しないとうまく出力できない。
https://github.com/neuecc/ZeroFormatter#union
今回でいえば下記のような実装。
var bytes = ZeroFormatterSerializer.Serialize<MonsterDataBase>(data);
感想
前回のコードは残してテストしようとしたがzfc.exeで事前コード出力をすると怒られてしまったので
コードを書き直して実装しなおした。
また、同名のenum型があると出力されたクラス名が重複してしまうっぽい。
仕様だけみてたら気が付かなった実装の注意点に気が付いてよかったですね。
実装の注意点だけヒューマンエラー入りそうで心配だったけども、
自前の実装をしないで異なるデータタイプを扱るのはよかった。