いろいろキャッシュ

CGI 動作時の動作を少しでも軽くするために、設定ファイルや文字列リソースなんかのテキストデータのバイナリ形式をキャッシュしたり、*.rhtml のコンパイル結果をキャッシュする修正をしていたんだけど、一段落したので本当に 0.8.6 と比べて速くなっているのか計測。

影舞-0.8.6

$ time w3m -dump 'http://localhost/kagemai-0.8.6/html/guest.cgi?project=cgibench&action=top' > /dev/null

real    0m0.531s
user    0m0.060s
sys     0m0.040s

影舞-0.8.7

$ time w3m -dump 'http://localhost/kagemai-0.8.7/guest.cgi?project=cgibench&action=top'    > /dev/null

real    0m0.691s
user    0m0.030s
sys     0m0.020s

なんか遅くなってる!?

遅いところを解消するためにプロファイルをとりながら作業したので、ありえないんだけど!と思いつつ両方のプロファイルをとって比較してみると、Kernel.gem_original_require というのが時間を消費してるのを発見。
画像認証用に RMagick を require するためのやつか・・・。

とりあえず、rubygems を require するのは画像認証用のイメージを作るときまで遅らせるように修正。

$ time w3m -dump 'http://localhost/kagemai-0.8.7/guest.cgi?project=cgibench&action=top'  > /dev/null

real    0m0.477s
user    0m0.030s
sys     0m0.030s

こんどは一応速くなっている。でも、DBまわりのライブラリを gem で入れたい(入れてる)人もいるだろうしどうしたものかね。

ついでに影舞 0.8.6 のほうで rubygems を require する状態にして計測

$ time w3m -dump 'http://localhost/kagemai-0.8.6/guest.cgi?project=cgibench&action=top'  > /dev/null

real    0m0.716s
user    0m0.060s
sys     0m0.030s

つまりあれだ、いろいろキャッシュしてもあんまり効果はないってことだね。むしろ無駄なコードが増えてるだけだと言っていいかもしれない。まだボトルネックになってる処理はあるんだけど、その修正は影響範囲がわりと大きいので、0.8.7 を出した次に。