Ruby 1.9が採用しているVMの最適化手法に、Direct Threaded Codeというものがあるらしい。
ターゲットコードが大きくなる代わりにVMの実行ループがかなり速くなるようだ。これを、Xslateに採用しない手はない、ということで簡単に実装してみた。
ブランチ:direct_threaded_code
実行ループ*1:http://gist.github.com/446673
従来のVMとパフォーマンスを比較すると、10%ほど高速化している。
従来のVM:
$ perl benchmark/interpolate.pl
Perl/5.10.1 i686-linux
Text::Xslate/0.1035
Text::MicroTemplate/0.11
Rate mt s///g xslate
mt 7314/s -- -3% -78%
s///g 7518/s 3% -- -77%
xslate 32880/s 350% 337% --DTC:
$ perl -Mblib benchmark/interpolate.pl
(snip)
Rate s///g mt xslate
s///g 7450/s -- -1% -80%
mt 7518/s 1% -- -80%
xslate 37236/s 400% 395% --他のベンチマークをみても10%程度の改善である。場合によっては40-50%程度の改善がみられることもあるというが、ひとまず安定した効果は得られるようなので、とりあえずこれで行く。
*1:ビルド時に自動生成される