msgpackとCRC

Githubのpull request。

msgpackにCRCを追加して、パケット解釈を高速化するという提案。曰く:

  • 毎回、不完全なmsgpackメッセージをパースするのは非効率
  • CRC型を追加して、最後から5バイト目が0xc6で受信CRCが一致するときだけパースしたら11倍程度のパフォーマンス向上が見られた

まぁ個人的にはfrsyuki先生と同じ意見で、0xc6をリザーブするのはともかく、メッセージフォーマットにCRCを含めるのはどうかと思う。
で、重要なのは、このようなテクニックで高速化しないといけない実装があるというポイントで、msgpackのような再帰的なストリームフォーマットではこの手の実装が出てきてしまうのは避けられないように思える。(msgpackはJSON互換のバイナリフォーマットなので、Arrayを入れ子にすることなどができてしまう。)
msgpackのライブラリやnmoshの実装はストリームパーサなので、1バイトづつデコードしながらデコードが完了するタイミングでコールバックすることができる。逆に言えばこの手のストリームパーサを実装できない言語や環境だと非常に悲しい結果になってしまう。