- 2009/7/12 日曜日 5:20:30
- perl
正規表現でHTML::FillInFormを実現しているHTML::FillInForm::Liteを最近つかっています。HTML::FillInFormの機能に加え、任意のオブジェクトを渡してそのアクセサからデータを取得してくれるため、DBIx::Class::AsFdatなどのモジュールを使わずに、DBICのrowデータをそのままfillinできるのがうれしかったりします。また、パラメータの取得方法部分もHTML::FillInFormよりも比較的拡張しやすくなっているので便利です。
ただ、性能がHTML::FillInFormよりもいいかというと自分の環境下やデータではそうでもなかったりして、特に大きいhtmlデータが対象だとかなり性能が劣化するようです。formのidをtargetで指定してあげることで大分緩和されますがHTML::FillInFromとの差は歴然としてあるようです。
そこで、C::P::FillInFormのようにhtml全体を対象とするのではなく、TTのフィルターを使ってfillinしてみました。
こんな感じでFILTERを定義して、
my $t = Template->new({
ENCODING => 'UTF-8',
FILTERS => {
fillinform => [\&fillinform, 1],
},
});
my $f = HTML::FillInForm::Lite->new;
sub fillinform {
my ($context, $data, @options) = @_;
return sub {
my $html = shift;
$f->fill(\$html, $data, @options);
};
}
テンプレートの中ではこんな風に使います。
[% FILTER fillinform(filldata) %]<form>...</form>[% END %]
formの部分は別ファイルにしておくとこんなふうにシンプルにかけるのがいい感じです。
[% INCLUDE parts/form.tt | fillinform(filldata) %]
fillinformってのはCではなくてVの仕事なんじゃないかとも思うのでこちらのほうがわかりやすいような気もしてきてます。
で、最後にベンチマークをのっけておきます。全体のfillinと局所化したものがだいぶ差があるのがわかると思います。また、それでもHTML::FillInFormに勝てていませんが、大分差も縮まっています。
use strict;
use warnings;
use utf8;
binmode STDOUT, ':utf8';
use Benchmark qw/cmpthese/;
use Template;
use HTML::FillInForm;
use HTML::FillInForm::Lite;
my $t = Template->new({
ENCODING => 'UTF-8',
FILTERS => {
fillinform => [\&fillinform, 1],
fillinformlite => [\&fillinformlite, 1],
},
});
my $f = HTML::FillInForm->new;
my $fl = HTML::FillInForm::Lite->new;
my $filldata = {mail => 'chiba@everqueue.com', name => '千葉征弘', tel => '03-3419-2801'};
cmpthese(5000, {
fillinall => sub {
$t->process('test.html', {
hoge => 'aha'
}, \my $output);
$f->fill(\$output, $filldata);
},
fillinpart => sub {
$t->process('test_part.html', {
hoge => 'aha',
filldata => $filldata,
}, \my $output);
},
fillinall_lite => sub {
$t->process('test.html', {
hoge => 'aha'
}, \my $output);
$fl->fill(\$output, $filldata);
},
fillinpart_lite => sub {
$t->process('test_part_lite.html', {
hoge => 'aha',
filldata => $filldata,
}, \my $output);
},
});
sub fillinform {
my ($context, $data, @options) = @_;
return sub {
my $html = shift;
$f->fill(\$html, $data, @options);
};
}
sub fillinformlite {
my ($context, $data, @options) = @_;
return sub {
my $html = shift;
$fl->fill(\$html, $data, @options);
};
}
test.html
test_part.html
test_part_lite.html
結果
Rate fillinall_lite fillinall fillinpart_lite fillinpart
fillinall_lite 274/s -- -62% -76% -77%
fillinall 729/s 166% -- -36% -40%
fillinpart_lite 1136/s 315% 56% -- -6%
fillinpart 1208/s 341% 66% 6% --
- 新しい: Email::MIMEの生成をtemplateエンジン経由で行ってくれるEmail::MIME::Kitがいい感じ
- 古い: Catalyst::Develを1.16以上にUpgradeしたとき
コメント:0
トラックバック:1
- この記事のトラックバック URL
- https://blog.everqueue.com/chiba/2009/07/12/212/trackback/
- トラックバックの送信元リスト
- HTML::FillInForm::Liteの使いどころ - へぼい日記 より
- trackback - use GFx::WebLog; より 2009/10/1 木曜日
[perl]UTF8-flagged strings affects regexps with the ”i” modifier
HTML::FillInForm::Liteの使いどころという記事で,HTML::FillInForm::Liteが遅いということが取り上げられていた。 試しに記事内のベンチマークを行ったところ,確かに遅い。 # HTML::FillInForm 1.06 Benc…