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