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の威力は絶大になるらしい。