「テキストプロトコルは遅くないよ」という話

「バイナリプロトコルは速い」「テキストプロトコルは遅い」という言説を、ときおり目にするけど、それって本当なのか。個人的には、それって昔の話だと思ってる。

SMTP みたいな、ペイロードについてもターミネータ(とエスケープ)を使うプロトコル*1は確かに遅い。で、FTPプロトコルでは、大容量のデータを「高速」に転送するために、制御用のTCPコネクションと転送用のコネクションを分けたりしてた。

だけど、HTTPプロトコルは、テキストプロトコルだけど、ペイロードについてはターミネータを使わない。keep-alive を行う際には、Content-Length ヘッダ(あるいはchunkedエンコーディング)を使うことで、ペイロードのパース/変換処理を不要にしている。別の言い方をすると、テキストプロトコルだからと言って、バイナリプトロコルよりペイロードの処理時間が長くなるとは限らない。HTTP 以降に開発されたテキストプロトコルで言うと、memcached のテキストプロトコルも同様の設計になってる。

あとはリクエストやレスポンスヘッダの処理時間だけど、このパース時間について、テキストプロトコルのほうがバイナリプロトコルよりも「遅い」というは確か。ただ、ヘッダはペイロードよりもずっと小さい(のでパース時間の差は小さい)し、結果、パース時間よりもヘッダのセマンティクスを解釈して実行する時間や、ネットワーク処理のオーバーヘッドのほうがずっと大きくなる(のが一般的)。

なので、個人的には、よほど理由がない限り(telnetで試せたりと、とっつきやすい)テキストプロトコルで十分だと思ってる。バイナリの方が速いとか「べき論」に拘るよりも、実際の実装を最適化するほうがよっぽど有意義。

追記: まとめて言うと、ペイロードのパースとエスケープを避けるために、ヘッダにペイロードサイズを入れるようなことをすべき。そうしていれば、テキストプロトコルでも遅くない (例: HTTP, memcached)、ってこと。

*1:ペイロード内から「\r\n.\r\n」(だっけ?)を検索する必要がある