では、sprintfを最適化すれば、様々なプログラムが より高速に動作するようになるのではないでしょうか。ということで作ったのが、qrintfです。
qrintfは、Cプリプロセッサのラッパーとしてソースコードに含まれるsprintfの呼出フォーマットを解析し、フォーマットにあわせたコードに書き換えることで、sprintfを高速化します。
たとえば、以下のようなIPv4アドレスを文字列化するコード片を
sprintf(
buf,
"%d.%d.%d.%d",
(addr >> 24) & 0xff,
(addr >> 16) & 0xff,
(addr >> 8) & 0xff,
addr & 0xff);
以下のように自動的に書き換え、実行時にフォーマット文字列の解析する負荷を省くことで大幅な高速化を実現しています。((int)(_qrintf_d(
_qrintf_c(
_qrintf_d(
_qrintf_c(
_qrintf_d(
_qrintf_c(
_qrintf_d(
_qrintf_init(buf),
(addr >> 24) & 0xff),
'.'),
(addr >> 16) & 0xff),
'.'),
(addr >> 8) & 0xff),
'.'),
addr & 0xff)
).off);
たとえば上記のコードの場合、以下のように、qrintfを用いることで10倍以上文字列化処理が高速化することを確認しています。
$ gcc -O2 examples/ipv4addr.c $ time ./a.out 1234567890 result: 73.150.2.210 real 0m2.602s user 0m2.598s sys 0m0.003s $ ./qrintf-gcc -O2 examples/ipv4addr.c $ time ./a.out 1234567890 result: 73.150.2.210 real 0m0.196s user 0m0.192s sys 0m0.003s
sprintfという便利なインターフェイスを維持したまま高速化できて、ハッピーですね!
No comments:
Post a Comment