Should we avoid C implementation?
先日のPycon mini JPでは、Tenjinのトークが好評だったようでした*1。
このスライドの中で述べられているのは以下のような事です。
- Web Appの実行時間の中でViewコンポーネントが占める割合は意外と大きい
- テンプレートエンジンをCで実装する必要はない
- 様々な言語*2のテンプレートエンジンの実行速度を比較してみると、Perlが最速だった
- Djangoのテンプレートエンジンは遅い
このスライド、見せ方が非常にうまいので一見なるほどという感じがしますが、この二番目の「テンプレートエンジンをCで実装する必要はない」という結論には疑問があります。
このスライドの前半にあるような最適化手法は私もずいぶん熱心にやったものです。しかし結局のところスクリプト言語はCには敵わないので、本当にボトルネックになるならCで書くのがよい、という結論に達しました。そして私はCでテンプレートエンジンXslateを書いたのでした。Cによる実装はデバッグが難しいため、特別な理由がないかぎりCで実装する必要がないというのは私も賛成しますが、Cで実装することで劇的に高速化することも実際に可能なのです。
さて、XslateとTenjinの速度差はどのようなものでしょうか。本来であればスライドで使ったベンチマークスクリプトを参考にしたいところですが、見つけられなかったのでXslateのディストリビューションに含まれるベンチマークスクリプトにTenjinを加え、測定してみました。これは、xslate.orgのトップページにあるグラフのもとになったベンチマークスクリプトです*3。TenjinはCPAN版を用いました。
https://github.com/gfx/p5-Text-Xslate/blob/master/benchmark/x-rich-env.pl
Xslate$ perl -Mblib benchmark/x-rich-env.pl --tenjin --template list Perl/5.12.2 i686-linux-thread-multi Text::Xslate/1.0000 Text::MicroTemplate/0.18 Text::MicroTemplate::Extended/0.12 Template/2.22 Text::ClearSilver/0.10.5.4 HTML::Template::Pro/0.9504 Tenjin/0.062 1..5 ok 1 - TT: Template-Toolkit ok 2 - MT: Text::MicroTemplate ok 3 - TCS: Text::ClearSilver ok 4 - HTP: HTML::Template::Pro ok 5 - Tenjin Benchmarks with 'list' (datasize=100) Rate TT Tenjin MT TCS HTP Xslate TT 79.3/s -- -56% -79% -93% -95% -99% Tenjin 179/s 126% -- -52% -84% -88% -98% MT 374/s 372% 108% -- -68% -76% -96% TCS 1158/s 1360% 545% 209% -- -25% -86% HTP 1548/s 1853% 763% 314% 34% -- -82% Xslate 8452/s 10561% 4609% 2159% 630% 446% --
Tenjin, MTがpure Perlであり、TTがCとPerlのハイブリッド、TCS, HTP, Xslateの実行エンジンはCによる実装です。TTは一部をCで実装しているものの、たしかに遅いです。しかし、Cによる3実装はすべてPerlによる実装より高速です。これならばCで実装する価値はあるのではないでしょうか。
なお、上記のベンチマークによればTenjinよりMTのほうが高速なようです。また、TenjinはMTやXslateとは異なり、スマートエスケープ機能を持っていません。したがって、少なくともPerlにおいては、テンプレートエンジンとしてTenjinを選択する理由はないでしょう。