Let's start Scheme

2012-05-16

Transcoderを改善したい

普通に使っているとテキストファイルのIOなんて(なぜか)そう使わないので気にならなかったのだが、httpsとか普通のhttpとかで一文字ずつ変換して流してると無駄だよなぁと思いはじめてきた。

とりあえずどれくらい違うのか試してみたいなぁと思い、utf8コーデック+put-stringだけの変更という形でベンチマーク。
ベンチーマークに使ったコードは以下。
(import (rnrs) (time) (sagittarius control))

(define times 10000)
(define test-string "12345678901235678901234567890123456790123456789\r\n")

(define tr (make-transcoder (utf-8-codec) 'crlf))

(time
 (let ((out (open-file-output-port "tmp.txt" (file-options no-fail) 'block tr)))
   (dotimes (i times)
     (put-string out test-string))
   (close-output-port out)))
これを0.3.2と開発版で比較。 結果は以下。
% ./build/sash.exe test.scm
;;  0.013002 real    0.016000 user    0.000000 sys

% sash test.scm
;;  0.312032 real    0.141000 user    0.172000 sys
上が開発版。びっくりするほど違う。これはやる価値ありだな。とりあえずやることにする。

書き出し側の実装完了。EOLの関係で多少パフォーマンスを犠牲にしたが、最終的には6倍くらい早くなった。
以下結果。
% ./build/sash.exe test.scm
;;  0.051995 real    0.031000 user    0.016000 sys

% sash test.scm
;;  0.312968 real    0.171000 user    0.141000 sys
EOLのチェックで一回舐める必要があるのが痛い。が、それでもこれだけ速度差があるのだから文句は言うまい。

No comments:

Post a Comment