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でないモジュールが使える場合に使えるかな。