Craft CMS でテンプレートのレンダリング時間を計測する

CMS の実装経験がある方であれば、その種類を問わず、テンプレートの書き方次第で出力にかかる時間が増減するのを一度は経験したことがあるのではないでしょうか?

その際、任意ブロックごとの処理で実際にどの程度時間がかかっているかを知ることができれば、効率的に改修できます。

そこで、今回は Craft CMS テンプレートのレンダリング時間を可視化する方法を2つご紹介します。
これは Craft CMS Advent Calendar 2021 15日目の記事です。

プラグインを利用する方法

はじめに、フリーの Template Comments プラグインを利用する方法です。

Template Comments
https://plugins.craftcms.com/templatecomments

このプラグインをインストールすると、Twig テンプレートに含まれる {% block %} タグにセットされる内容と {% include %} タグで読み込まれる内容それぞれのレンダリング時間を HTML コメントとして出力されます。

出力された HTML ソースのサンプル

計測対象の devMode が ON であることが条件となるものの、簡単に導入できます。

テンプレートタグを利用する方法

次に、計測したい箇所にテンプレートタグを埋め込む方法です。

{# 処理直前の時刻をセット #}
{% set startTime = date('now') %}

(中略:ここで計測したい何らかの処理を実行)

{# 処理直後の時刻をセット #}
{% set endTime = date('now') %}

{# マイクロ秒単位の差分を計算 #}
{% set diffTime = (endTime.format('U.u') - startTime.format('U.u')) * 1000 %}

{% if craft.app.config.general.devMode %}
  {# 差分をコンマ2桁までに整形して出力 #}
  {{ diffTime | number_format(2, '.', ',') }}ms
{% endif %}

このサンプルでは、計測したいブロックの前後で date('now') を異なる変数にセットし、その差分を計算したものを整形して出力します。この方法のメリットは、計測対象とする範囲を任意で調整できる点です。

プラグイン同様、本番環境で出力されることのないよう craft.app.config.general.devMode で判定処理を加えています。

まとめ

今回は Craft CMS テンプレートのレンダリング時間を計測する方法についてまとめてみました。

実際に計測しながら改修していくことで、より効率的なテンプレートの書き方を知るキッカケにもなりますので、ぜひお試しください。