FillInFormのインスタンスを使い回す
mod_perl環境では、いったんロードしコンパイルしたインスタンスは永続的に使用可能である。従って、これを利用すればもっと速いんじゃないかという話。前回はCGI環境を想定したのでさらにmod_perlも考えてみよう。
というわけで、ベンチコード。
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;
use CGI;
use HTML::Template;
use HTML::FillInForm;
my $q = CGI->new;
$q->param("text","text field");
$q->param("checkbox","checkbox2","checkbox5");
$q->param("select","select3");
my $fif = HTML::FillInForm->new;
Benchmark::timethese(1000,{
"HTML_TEMPLATE_CGI" => ?&HTML_Template_CGI,
"FIF_CGI" => ?&FIF_CGI,
"FIF_MODPERL" => ?&FIF_MODPERL
}
);
sub HTML_Template_CGI {
my $tmpl = HTML::Template
->new(
filename => "./HTML_Template.tmpl",
asociate => $q
);
$tmpl->param("checkbox_".$_, 'checked="checked"')
foreach($q->param("checkbox"));
$tmpl->param("select_".$_, 'selected="selected"')
foreach($q->param("select"));
$tmpl->output;
}
sub FIF_CGI {
my $html = HTML::Template
->new( filename => "./HTML_FillInForm.tmpl" )
->output;
HTML::FillInForm
->new
->fill(
scalarref => ?$html,
fobject => $q
);
}
sub FIF_MODPERL {
my $html = HTML::Template
->new( filename => "./HTML_FillInForm.tmpl" );
$fif->fill(
scalarref => ?$html,
fobject => $q
);
}結果は次の通り。
Benchmark: timing 1000 iterations of FIF_CGI, FIF_MODPERL, HTML_TEMPLATE_CGI... FIF_CGI: 11 wallclock secs ( 9.90 usr + 0.14 sys = 10.04 CPU) @ 99.60/s (n=1000) FIF_MODPERL: 4 wallclock secs ( 4.33 usr + 0.18 sys = 4.51 CPU) @ 221.73/s (n=1000) HTML_TEMPLATE_CGI: 7 wallclock secs ( 6.37 usr + 0.20 sys = 6.57 CPU) @ 152.21/s (n=1000)
速いなmod_perl!いや、正確には、『mod_perlっぽい動作』なんだが。こうした、インスタンスを使い回せる処理では(パーサ等はだいたい使い回せると思うが)、mod_perlの威力は絶大になるらしい。