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を選択する理由はないでしょう。

*1:私はこのトークを見ておらず、おもにtogetterのまとめを参照しています。

*2:Python, Perl, Ruby, and PHP

*3:FastCGIのような永続的なWebアプリケーションを想定したベンチマークです。