Xslate, as of 0.1009

id:tokuhirom の助言を受けて、APIの見直しなどをした*1

  • キャッシュディレクトリのデフォルトが、テンプレートファイルと同じディレクトリからFile::Spec->tmpdirへ。これはcache_dirオプションで変更もできる
  • 一引数の render(\%vars) は混乱を招くため廃止。文字列をのレンダリングはrender_string($str, \%vars)を使うようにした
  • fileオプションとstringオプションも混乱を招くため廃止
  • TT風構文でINCLUDE、UNLESS、関数呼び出し、メソッド呼び出しをサポートした
  • importオプションでモジュールの関数を使えるようにした。エクスポート可能な関数であれば自由に使えるので、単純なラッパープラグインのための特別な名前空間は必要ない。

また、テンプレートカスケーディングを拡張し、cascade with ...ができるようになった。

: cascade myapp::base with role::foo, role::bar
: # or
: cascade with role::foo, role::bar

後者の構文は、Mooose::Roleと同じように動く。
role/foo.tx:

:around hello -> {
-------------
:super
-------------
:}

main.tx:

:cascade with role::foo # or with "role/foo.tx"
:block hello -> {
Hello, world!
:}

Output:

-------------
Hello, world!
-------------

Moose::Roleに慣れているなら、こちらのほうが直感的かもしれない。ただし、テンプレートカスケーディングはまだ仕様も機能も不安定であり、改善の余地があると思われる。特にエラーメッセージで適切なファイル名が出せないので、この点が改善しないと使うのが難しい。

おまけ。「テンプレートをファイルから読み出し、ある程度数の多いデータをforeachで回す」というありがちなパターンで、Xslate, MT, CS, TTを比較するスクリプトベンチマークをとってみた。なお、最高のパフォーマンスを得るためには、cache => 2をつける。このオプションにより、元ファイルの更新チェックが省略される。

$ perl -Mblib benchmark/others.pl 100 # データ量100
Perl/5.10.1 i686-linux
Text::Xslate/0.1009
Text::MicroTemplate/0.11
Text::ClearSilver/0.10.5.4
Template/2.22
1..3
ok 1 - TT
ok 2 - TCS
ok 3 - MT
         Rate     tt     mt     cs xslate
tt      327/s     --   -63%   -86%   -96%
mt      881/s   169%     --   -63%   -90%
cs     2399/s   634%   172%     --   -74%
xslate 9221/s  2721%   947%   284%     --

この環境では、TTの28倍、MTの10倍、CSの4倍という結果となった。ほかのベンチマークを参照すると、純粋なテンプレートの実行*2でMTの2-4倍、ファイルから読み出すようにするとMTの10倍以上*3という数字が出る。テンプレートカスケーディング*4に至ってはMTの80倍以上にも達する。
これだけ高速ならば、「速いテンプレートエンジンをつくる」という当初の目的は達したといえよう。

*1:0.1006からの差分

*2:benchmark/interpolate.pl, benchmark/for.pl, benchmark/expr.pl

*3:benchmark/others.pl, benchmark/including.pl

*4:benchmark/cascade.pl - 比較対象はT::MT::Extendedのテンプレート継承