Template-Toolkitのnewは遅い

ClearSilver の Perl バインディングを使う(Perlのテンプレートエンジンのベンチマーク) - spiritlooseのはてなダイアリー
古〜い記事に対して今更なところもあるのですが。

Template-Toolkitは、テンプレートファイルをprocessで指定するAPIになっているので、インスタンス:テンプレートファイルが1:1ではないのです。
つまりインスタンスを一個作っておいて、あとはどのテンプレートファイルに対してもそのインスタンスを使い回せるようにできています。



毎回(不要な)newをするかしないかでどれぐらい違うかというと、

use strict;
use warnings;

use Benchmark qw(timethese cmpthese);
use Template;

my $tt_instance = Template->new;

my $bench = timethese(10000,
    {
        'Template-Toolkit' => sub {
            my $tt = Template->new;
            my $out;
            $tt->process('hello.tmpl', { message => 'hello world!' }, \$out) or die;
        },
        'Template-Toolkit instance' => sub {
            my $out;
            $tt_instance->process('hello.tmpl', { message => 'hello world!' }, \$out) or die;
        },
    },
);
cmpthese($bench);

このような環境で

% perl -v

This is perl, v5.8.7 built for cygwin-thread-multi-64int
(with 1 registered patch, see perl -V for more detail)

% perl-version Template
Template = 2.19

だいたい12倍ぐらい速くなりました。

Benchmark: timing 10000 iterations of Template-Toolkit, Template-Toolkit instance...
Template-Toolkit: 49 wallclock secs (35.45 usr +  7.20 sys = 42.66 CPU) @ 234.43/s (n=10000)
Template-Toolkit instance:  4 wallclock secs ( 3.00 usr +  0.16 sys =  3.16 CPU) @ 3167.56/s (n=10000)
                            Rate      Template-Toolkit Template-Toolkit instance
Template-Toolkit           234/s                    --                      -93%
Template-Toolkit instance 3168/s                 1251%                        --

(このベンチ、ホントに合ってるのか?あとnewが遅いのかDESTROYが遅いのか調べてないことに気付いたけどまあいいや。)
環境によっては変わらないかも(暇な時にProfileするかも)
テンプレートのコンパイルが発生しているかどうかという違いかも

それでもClearSilverは更に数倍速いわけで、テンプレートの処理速度がネックになっているなら選択肢に入ると思います。
ただ3倍の差が大きいかどうかは、リクエスト数やキャッシュの有無で変わってくると思います。

また、デザイナーにClearSilverの文法はちょっと厳しい気はするので躊躇してしまいます。


「有名な人たちが次々とClearSilverに移行したから、俺もClearSilverに移行するぜ!」みたいなノリではなく、自身の環境において何に重きをおくべきかを見極めて、適切な選択をしていけば良いと思います。←って誰に言ってんだこれ



・・・いっぱい突っ込みが来そうでガクガク(((n;‘Д‘))ηナンダカコワイワァ

別のLinuxマシン、
$ perl -v
This is perl, v5.8.8 built for i686-linux-thread-multi

$ perl-version Template
Template = 2.19
という環境で同じベンチやったら
Benchmark: timing 10000 iterations of Template-Toolkit, Template-Toolkit instance...
Template-Toolkit: 16 wallclock secs (15.16 usr +  0.31 sys = 15.47 CPU) @ 646.41/s (n=10000)
Template-Toolkit instance:  3 wallclock secs ( 2.19 usr +  0.00 sys =  2.19 CPU) @ 4566.21/s (n=10000)
                            Rate      Template-Toolkit Template-Toolkit instance
Template-Toolkit           646/s                    --                      -86%
Template-Toolkit instance 4566/s                  606%                        --
と、インスタンス使い回しの方が6倍速いという結果になりました。