キャッシュの効果が出やすい/出にくいモジュール(その2)

一昨日の記事に続いて、キャッシュの効果が出やすい/出にくいモジュールについて考察します。

1.キャッシュの再利用回数が少ないと効果が出にくい

カウント系のタグなど、モジュールの中にデータベースアクセスが多く発生するテンプレートタグが含まれているほど、キャッシュの効果が出やすくなります。
ただ、データベースアクセスが多いタグがあっても、キャッシュがあまり効かないこともあります。

例えば、Aというテンプレートモジュールがあり、その中にデータベースアクセスが多く発生するタグが含まれているとします。
また、ブログ全体を再構築すると、モジュールAが100回再構築されるとします。
さらに、モジュールAの出力は、インクルード先のテンプレートにかかわらず同じであるとします。

この場合、モジュールAをキャッシュすれば、100回の再構築を1回に抑えることができます。
その結果、このモジュールの再構築に要する時間が、おおむね100分の1になります。

一方、ブログ全体を再構築しても、上記のモジュールAが10回しか再構築されない場合を考えてみてください。
この場合、このモジュールの再構築に要する時間は、おおむね10分の1になります。

100分の1と10分の1では、明らかに前者の方が効果が大きいです。
このように、「ブログ全体を再構築したときに、そのモジュールが何回再構築されるか」という点も、キャッシュの効果を考える上で重要なポイントです。

2.「コメント」「トラックバック」モジュールのキャッシュの効果

yujiroさんは、「コメント」「トラックバック」(およびブログ記事の本文)のテンプレートモジュールをキャッシュするテストもされてました。
結果は、キャッシュ前が1時間51分、キャッシュ後が1時間43分でした。
これだけを見ると、キャッシュの効果があまりなかったように思えるかも知れません。

ただ、yujiroさんは、「テストを1回しか行わなかった」と書かれています。
しかし、コメント/トラックバックのモジュールの場合、キャッシュの効果が出るのは、2回目以降になります。

例えば、「コメント」のテンプレートモジュールをキャッシュすることを考えてみます。
このテンプレートモジュールは、記事ごとのコメントを出力するものですので、再構築結果は記事ごとに異なります。
しかも、通常のブログだと、ブログ全体を再構築しても、このテンプレートモジュールは個々のブログ記事で1回ずつ再構築されるだけです。
そのため、キャッシュをオンにした直後では、ブログ全体を再構築しても、その再構築の間にキャッシュが再度利用されるタイミングがありません。
むしろ、キャッシュを使わない場合と比べて、キャッシュに保存する処理が増えるため、再構築の時間は若干伸びます。

一方、一度ブログ全体を再構築した後、再度ブログ全体を再構築することを考えて見ます。
この場合、キャッシュをオンにした直後の再構築でキャッシュが作られていて、そのキャッシュを利用することができます。
そのため、再構築の時間を短縮することができます。

ためしに、テスト用ブログ(記事300件/コメント2177件/トラックバックは0)で、コメントとトラックバックのテンプレートモジュールのキャッシュをテストするために、以下の4つのケースで再構築時感を測定してみました。

ケース内容
ケースAキャッシュをオフにして、ブログ記事アーカイブを再構築
ケースBキャッシュをオンにした直後に、ブログ記事アーカイブを再構築
(キャッシュをオンにしてから1回目の再構築)
ケースCケースBの直後に、ブログ記事アーカイブを再構築
(キャッシュをオンにしてから2回目の再構築)
ケースDケースCの直後に、ブログ記事アーカイブを再構築
(キャッシュをオンにしてから3回目の再構築)

テストの結果は以下のようになりました。
解説で述べたように、キャッシュをオンにした直後の再構築では、キャッシュを保存する処理が増える一方、キャッシュを再利用するタイミングがないので、所要時間が若干延びています。
一方、2回目や3回目の再構築では、1回目で作られたキャッシュを利用することができますので、所要時間が短縮されます。

ケース所要時間
ケースA43秒
ケースB45秒
ケースC32秒
ケースD32秒