Grani Engineering Blog

株式会社グラニはC#を中心として、ASP.NET、Unity、VR開発を行っています。

MessagePack for C#に見るC#でのバイナリの読み方と最適化法

CTOの河合(@neuecc)です。今回は、2017年3月3日に行った社内での資料を公開します。

グラニでは、そして最新作の黒騎士と白の魔王では、私の開発したMessagePack for C#を全面的に採用しています。採用範囲は、クライアントとサーバー間でのリクエスト/レスポンス通信の他に、サーバーサイドでもRedisへのシリアライズ等に利用しています。

MessagePack for C#は、グラニでの豊富なシリアライザへの知見に基づき開発された、パフォーマンスと機能拡張性の両面において優れた、C#でのバイナリシリアライザではベストといえる仕上がりになっています。そして、既に実プロダクトで動いているので、プロダクション環境で安心して使えるという実績も備えています。

C#においてバイナリの読み書きは基本的にBinaryReader/Writerを用いて行いますが、より変則的な、あるいはパフォーマンスへの最適化を考えていく場合、もう少し低レベルに降りていくのもよいでしょう。資料では、C#における低レベルな手法について幾つか挙げています。また、MessagePack for C#の実装において行った泥臭い最適化の小ネタ(LookupTableから引いて判定を抑える、デリゲートではなくあえての愚直なインスタンスメソッド、構造体の配列など)も、具体的な使用例から挙げています。

まとめ

MessagePack for C#の真の誕生理由はUnite 2017 Tokyo講演「「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術」の資料にて解説しましたが、単純に言って追い詰められていたからです……!パフォーマンス問題を裏口突破でなんとかするという奇策。人間、追い詰められると良い仕事をしますね……!というのはともかく、機能面でも黒騎士と白の魔王におけるMessagePack-CSharpのUnionの活用事例のように、よりよく活用できているので、結果として開発したのは正解でした。

グラニでは社内勉強会を頻繁に、でもないですが不定期定期に開催しています。今回のように、社外に出しても問題がないものは公開していこうと考えていますので、今後も是非お楽しみに。