memcachedのバイナリプロトコル

memcached.c の dispatch_bin_command() はバイナリプロトコルのディスパッチルーチンであるが、だめじゃん。

switch(c->cmd) {
case PROTOCOL_BINARY_CMD_VERSION:

とかしている。ここは表引きだろう。しかもc->cmdの定義はuint8_tではない。だめじゃん。深入りしないことにした。

動かしたことすらないmemcachedですがちょっと気になったのでソースを見てみました。

# 2008年09月18日 TAKESAKO TAKESAKO memcached 「ここは表引きだろう」→普通switch文はコンパイラが最適化してくれるんじゃないのかな。コンパイラによって癖があるので書き方次第だけど。

そうなんだけど、memcached.cの中だけでswitchが11箇所も出てくるのは効率以前に見た目としてもどうかと思う(getoptとかもあるけどさ)。
何でかというと、このバイナリプロトコルというのは現在開発中のバージョン1.3系で実装されているもので、現行バージョンでは"set"とか"replace"とかが飛び交うテキストプロトコルになっている。
http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
んで、1.3ではバイナリだけではなくテキストプロトコルも引き続きサポートしているので、せっかくバイナリプロトコルにしたのにswitchだらけのままになっちゃったんじゃないかな、という気がしました。
はてなブックマーク - 漢(オトコ)のコンピュータ道: memcachedの驚愕の事実。
みんなmemcachedが6000行で実装されていることに驚いているようだけど、あれはほとんどlibeventのおかげであって、メモリ読み書きするのにそんなにコード書く必要あるわけない。特別効率の良いコードを書いているようには見えないけどな。
というわけで誰かバイナリプロトコルオンリーのmemcachedクローンに挑戦してみてはいかがでしょうか。