テンプレートの構築パフォーマンス
「推測するな、計測せよ」とは名著「サーバ/インフラを支える技術」の中のプログラマの言葉です。MTIgnore タグが構築パフォーマンスに影響を与えるのかという話題ですが、この点を簡単なプログラムを書いて計測してみました。
計測に使用したプログラムの簡単な説明をします。指定された回数分、ループで回して<MTIgnore><MTIgnore><MTIgnore>〜</MTIgnore></MTIgnore></MTIgnore>と入れ子にした場合(1.)と、<MTIgnore></MTIgnore><MTIgnore></MTIgnore><MTIgnore></MTIgnore>〜と指定回数分だけ並べた場合(2.)を計測します。時間の計測には Time::HiRes モジュールを利用します。そして、上記のテンプレートについて、コンパイルとビルドに要する時間をそれぞれ計測しました。
回数 | コンパイル(1.) | コンパイル(2.) | ビルド(1.) | ビルド(2.) |
---|---|---|---|---|
1 | 26ms | 25ms | <0ms | <0ms |
10 | 26ms | 26ms | <0ms | 1ms |
100 | 28ms | 33ms | <0ms | 6ms |
1,000 | 43ms | 86ms | <0ms | 51ms |
10,000 | 211ms | 628ms | <0ms | 510ms |
100,000 | 1,915ms | 6,056ms | <0ms | 5,082ms |
1,000,000 | 10,299ms | 60,331ms | 14ms | 50,615ms |
結論から言うと、タグ数が1,000未満のような通常の運用の範囲で書かれるテンプレートでは、MTIgnoreテンプレートタグがそのパフォーマンスに与える影響はほとんどありませんよ、ということです。むしろ、積極的に使って読みやすいテンプレートを書くことを心がけた方が良いでしょう。
上記の計測結果で重要なことは、ビルド処理と同等、またはそれ以上にコンパイルに要する時間が無視できない、という点です。ビルドに関する処理部分だけを見て、パフォーマンスを論ずる方がいらっしゃいますが、むしろ MovableType テンプレートのようなインタプリタ言語では、コンパイラ部分の性能が大きく影響してきます。この辺りは情報理論、インタプリタやコンパイラの勉強をされた方なら常識ですね。MovableTypeのテンプレートは典型的な再起下降構文解析器が使われていて、ちょっと面白いのは、MTIgnoreの処理が特別に書かれていることです。これはC言語のようなプリプロセッサを持たないためと考えられます。具体的には、MTIgnoreタグについては、そのコンテンツを全く無視するような動作になっており再帰下降しません。そのため、非常に巨大なネスト(1.のケース)でも、処理時間が爆発せずに済んでいるわけです。
興味のある方は、MT::Build::compile
を読んでみると面白いと思います。