自分のバカさ加減にガッカリする

関連エントリー。

ってなわけで、開発中の MT4i 3.0 なのですが、「キャッシュ積んだのにあんまし速くなってねーよ、なんでじゃー」とずっと悩んでいたわけです。

はい、その悩みが今さっき解決しました。

まー何、単純な話です。MT4i では スクリプトのほぼ冒頭で

MT->new(hogehoge);

とかやっているわけです。んで、これ冒頭に書いているので、当然 CGI へアクセスする度に毎回呼ばれてました。

画像を縮小して表示する時も。

リダイレクタを表示する時も。

そしてもちろん、キャッシュがヒットした時にも。

必要ないにも関わらず、MT->new していたのです。なので、こいつを必要な時にしか呼ばないようにしてみました。そしたらあんた、めたくそ速くなってしまいましたよ!というお話。

リファクタリング前:
Benchmark: timing 50 iterations of 00.224, 01.30c, 01.30n...
    00.224: 50 wallclock secs ( 0.28 usr +  0.05 sys =  0.33 CPU) @ 152.38/s (n=50)
            (warning: too few iterations for a reliable count)
    01.30c: 55 wallclock secs ( 0.19 usr +  0.01 sys =  0.20 CPU) @ 256.00/s (n=50)
            (warning: too few iterations for a reliable count)
    02.30n: 61 wallclock secs ( 0.16 usr +  0.04 sys =  0.20 CPU) @ 256.00/s (n=50)
            (warning: too few iterations for a reliable count)
リファクタリング後
Benchmark: timing 50 iterations of 00.224, 01.30c, 01.30n...
    00.224: 43 wallclock secs ( 0.28 usr +  0.05 sys =  0.34 CPU) @ 148.84/s (n=50)
            (warning: too few iterations for a reliable count)
    01.30c: 12 wallclock secs ( 0.18 usr +  0.01 sys =  0.19 CPU) @ 266.67/s (n=50)
            (warning: too few iterations for a reliable count)
    02.30n: 48 wallclock secs ( 0.17 usr +  0.02 sys =  0.20 CPU) @ 256.00/s (n=50)
            (warning: too few iterations for a reliable count)

上記は、LWP で単純に MT4i の個別記事ページを50回叩く処理のベンチマークです。「00.224」が version 2.24、「01.30c」が 3.0 のキャッシュ有り、「02.30n」が 3.0 のキャッシュなしです。もうね、リファクタリング前と後で、キャッシュ有りの場合が比較にならないくらい速くなっているのが分かると思います。

苦労してテキストキャッシュを実装した割には結果があまりよろしくなく、「Greg Packer's Publishing でも導入するしかないのか!」などとほぼ一からコーディングしなおすことを考えてモチベーション下がりまくりだったんですが、これでだいぶ持ち直しました。

MT4i 3.0βの公開は近い!…かも。