HTML::Template::Pro
HTML::Template::Pro
HTML::TemplateのXS版。HTML::Templateと比べて、10倍〜25倍早いらしい。mod_perlでも効果あるようだ。
HTML::Template::Pro loads, parse and outputs template on fly,
when you call $tmpl->output(), in one pass. The corresponding code is
written in C and glued to Perl using Perl+XS. As a result,
comparing to HTML::Template in ordinary calls, it runs
10-25 times faster. Comparing to HTML::Template with all caching enabled
under mod_perl, it still 1-3 times faster.
ベンチマーク結果。スクリプトは追記に
$ perl htmltmplpro_bench.pl Benchmark: timing 1000 iterations of HTML::Template, HTML::Template::Pro... HTML::Template: 10 wallclock secs ( 9.43 usr + 0.01 sys = 9.44 CPU) @ 105.93/s (n=1000) HTML::Template::Pro: 1 wallclock secs ( 1.02 usr + 0.09 sys = 1.11 CPU) @ 900.90/s (n=1000)
確かに10倍弱ぐらいは早い。
#!/usr/bin/perl
use strict;
use HTML::Template;
use HTML::Template::Pro;
use Benchmark;
my $html = <<EOF;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>test</title>
</head>
<body>
<TMPL_LOOP NAME=list><TMPL_IF NAME=key><TMPL_VAR NAME=key>,<TMPL_VAR NAME=value><br></TMPL_IF>
</TMPL_LOOP></body>
</html>
EOF
my @list;
for(my $i=0;$i<30;$i++){
push(@list,{
key=>$i,
value=>rand($i)
});
}
Benchmark::timethese(1000, {
'HTML::Template' =>?&htmltmpl,
'HTML::Template::Pro' => ?&htmltmplpro,
});
sub htmltmpl{
my $tmpl = HTML::Template->new(
scalarref => ?$html,
die_on_bad_params=>0
);
$tmpl->param('list',?@list);
$tmpl->output;
}
sub htmltmplpro{
my $tmpl = HTML::Template::Pro->new(
scalarref => ?$html,
die_on_bad_params=>0
);
$tmpl->param('list',?@list);
$tmpl->output;
}
HTML::TemplateってPure-Perlなので、ポータビリティが高いところがいいのだが、mod_perlが使えなくて、シビアな動作条件がでていて、運良くPure-Perlでないモジュールが使える場合に使えるかな。