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倍以上にも達する。
これだけ高速ならば、「速いテンプレートエンジンをつくる」という当初の目的は達したといえよう。