TemplateToolkitをより早く!!・・・できなかったorz

ティーティーのさぁーディスクアイオー減らしたら早くなるんじゃね?

と言った事を思い立ちやっては見たものの、ごめんなさい、見くびってました、出直して来ます。

というお話を晒させていただきます。


まず、何かと言いマスト
TemplateToolkitのオプションでCOMPILE_DIRというのが有ります。これは強力でTTの文法で書いたテンプレートをperlのコードに書き下してくれるというやつです。よって一回コンパイルしてくれると次回からはパースせずとの良い!速い!という訳であります。
↓このへん参照。
http://search.cpan.org/~abw/Template-Toolkit-2.19/lib/Template/Document.pm

で、コンパイルされた結果がCOMPILE_DIRで指定したパスに溜まってゆくと。

例えば

Template->new(ABSOLUTE => 1, COMPILE_DIR => '/tmp/hoge');

と指定した場合/tmp/hogeコンパイルしてコード達が溜まって行く訳ですよ。これが。


で、冒頭の疑問に戻る
これを毎回読み込んで実行してるんならメモリに乗っけちゃったら早くなるんじゃね?

と冒頭の浅はかな発想に行き着いた訳であります。言っておきますけどかなり浅はかです。


衝撃の結末
↓のようなコードを書きましたとさ。

use strict;
use warnings;

use Template;
use File::Temp qw/tempfile/;
use Benchmark;

my $template = 'I am [% iam %]';
my ($fh, $filename) = tempfile();
$fh->print($template);
$fh->close;

sub compile {
    my $tt = Template->new(ABSOLUTE => 1, COMPILE_DIR => '/tmp/tt_shm/');
    $tt->process($filename, { iam => 'matsumo' }, \my $out) or die;
}

sub complile_shm {
    my $tt = Template->new(ABSOLUTE => 1, COMPILE_DIR => '/dev/shm/');
    $tt->process($filename, { iam => 'matsumo' }, \my $out) or die;
}

my $b = Benchmark::timethese(3000, {
            compile      => \&compile,
            complile_shm => \&complile_shm,
          });

Benchmark::cmpthese($b);

↓のような結果が出ましたとさ。

Benchmark: timing 3000 iterations of compile, complile_shm...
   compile: 11 wallclock secs (10.65 usr +  0.40 sys = 11.05 CPU) @ 271.49/s (n=3000)
complile_shm: 11 wallclock secs (10.52 usr +  0.42 sys = 10.94 CPU) @ 274.22/s (n=3000)
              Rate      compile complile_shm
compile      271/s           --          -1%
complile_shm 274/s           1%           --

ほっとんど変わりませんorz

で、改めてhttp://search.cpan.org/~abw/Template-Toolkit-2.19/lib/Template.pm#Caching_and_Compiling_Optionsを良く見ると・・・・。

CACHE_SIZE

Maximum number of compiled templates to cache in memory (default: undef - cache all)

もうやってるっぽいorz すいませんでした。

という訳で改めて、TemplateToolkitって凄いよね!!ドキュメントはちゃんと読もうね!!というお話でした。

お粗末でした。