ホーム > perl > HTML::FillInForm::Liteの使いどころ

HTML::FillInForm::Liteの使いどころ

  • 投稿者: chiba
  • 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%           --
はてなブックマーク - HTML::FillInForm::Liteの使いどころ

コメント: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…

ホーム > perl > HTML::FillInForm::Liteの使いどころ

検索
フィード
メタ情報

ページの上部に戻る