2003年7月12日(土曜日)
鳩丸高速化計画
というわけで hatomaru.dll 高速化計画第一弾。
最近 hatomaru.dll が遅い気がしているわけですが、実はその原因のひとつは既に分かっています。コメントの数が増えたからです。コメントが増えると日記の表示は遅くなります。
コメントを表示しなければ関係ないのでは……と思うかも知れませんが、そうではありません。日記の各トピックには、ついているコメントの件数を表示しているからです。件数を表示するためには、コメントの数を数えなければなりません。
※見出しが付いたひとまとまりのことを、内部ではトピックと呼んでいます。そのまんま Topic というクラスになっています。
実は今まで、このルーチンに関してはほとんどなにも考えませんでした。あるトピックについているコメントの数をカウントする際は、GetCommentCount というメソッドを呼んでいます。そのメソッドの内容は以下のような処理になっています。
- コメントの XML ファイルが読み込まれていなければ読んで、topic要素だけを抽出した XmlNodeList を用意しておく。
- ひとつひとつ XmlNode を読んで、そのトピックの URL とコメント先の URL が一致するか判定する。
- 一致していたらカウンタを増やす。一致しなければ何もしない。
- 読み終わったらカウンタの数字を返す。
まあ特に何も考えていないのですが、恐ろしいのはここからです。ひとつのページ内に複数のトピックが表示される場合は、何も考えずにトピックの数だけ GetCommentCount が呼ばれます。XML ファイルのロードは一回しか行いませんが、XmlNodeList のサーチは表示されるトピックの数だけ繰り返されることになります。ページ表示の際に「URL が一致したか」という判定が何回行われるかというと、これはトピックの数×コメントの総数、となります。これはトピックが少ない場合、あるいはコメントが少ない場合にはほとんど問題ありませんが、両者が増えてくると大変なことになります。
……というわけなので、このアルゴリズムをちょっとだけ見直しました。具体的には、以下のような処理を入れています。
- 最初の XML ロード時にある程度振り落としておく。たとえば、えび日記を表示するのなら、ぐろっさりに対するコメントは必要ない。
- あるトピックのコメントであると判定された要素は他のトピックのコメントではあり得ないので、リストから削除する。
これだけですが、それでもトピック数が多いときの処理速度はかなり向上したはずです。特に、話題別で数の多いトピックを表示するときなどに効果が大きいかも。
※ただし、内部キャッシュがある場合の速度は変わりません。また、当然ですがコメント投稿機能実装以前の速度には及びません。
とは言え、これでもコメントの件数が増えればやっぱり遅くなります。根本的に異なる方法、たとえば、投稿するときに数えてその結果を保存しておくとか、そういった方法の方が速くなるような気はします。まあ、あまりにも遅くなったら、その時にまた考えましょう。
- 「鳩丸高速化計画」へのコメント (3件)
関連する話題: えび日記 / hatomaru.dll / 鳩丸高速化計画
- 前(古い): 2003年7月11日(Friday)のえび日記
- 次(新しい): 2003年7月13日(Sunday)のえび日記