3列化したり plugin をいろいろ追加したりしているうちに、気がつくとページの生成に 3~5秒もかかるようになってしまいました(^^;
もしかしたら増えすぎたスキンを一気にまとめたりしたのもよくなかったかも…。結果として <if>-</if> が増えちゃいましたので。
というわけで原因を探るべく測定開始(^^)/
最初のターゲットは実際にページを生成する関数 CreateHTML() さん。
getmicrotime() 関数を利用した測定処理をあちこちに埋め込み、実行です。
その結果、中央の列に表示している記事リストの 1つ 1つを処理するのに約 300~1000ms もかかってることを発見しました。
同じ <%=$site_items%> を利用していても、右の列にある新着のほうは 1つにつき約 2~3ms しかかかっていないので、どうやら使用している ITEM スキンが悪いようです。
ではスキンのどの部分がよくないかな、と今度は ITEM スキンを処理する GetContentsEach() さんを測定です。
そして問題の ITEM スキンでは、skin_macro() の処理に 250~1000ms もかかることが判りました。
やっぱり <if>-</if> かなぁ…( ̄x ̄)
もうここまできたら奥の奥まで突き進もう! と skin_macro() 内を測定。
予想通り処理時間のほとんどが <if> と対になる </if> の検索に費やされていたです。
さらに奥へ。なんだか当初の目的を忘れて楽しくなってきたです(笑)
真理の探究はいつだってわくわくです(*^-^*)
真実はいつもひとつだってコナンくんも言ってますし。
そうして辿り着いたのが、</if> を探すまでに 7000回以上もループしてしまうという事実でした。
でも <if>-</if> の中身は 1000文字に満たないのに…
ってしまったぁぁぁぁ~っ!Σ( ̄口 ̄;)
skin_macro() が呼ばれるまでに行われた処理で中身がいろいろ膨れあがっているのでした。
ヘンゼル敗北 orz
…とここで終わるのも悔しかったのでループを加速する処理を入れてみました。
いあ、そんなことしてないでスキン直せ、ってのもあるですが(^^;;;
ここまでくるともうヘンゼルの趣味ってことで(^^)b
で、問題のループ冒頭に挿入したのが以下の処理です。
$spos = strpos( $a, '<if ', $pos_end );
$epos = strpos( $a, '</if', $pos_end );
if( $spos !== false )
{
if( $epos === false || $spos < $epos ) { $pos_end = $spos; }
else { $pos_end = $epos; }
}
else
{
if( $epos !== false ) { $pos_end = $epos; }
}
これでループ回数が 7000以上から 35回に減り、</if> の探索時間も 200~1000ms から数ms まで短縮されました。
というか、だから <if>-</if> の中にやばいものが入っていなければ何の問題もないんですけどね~(^^;
Re:ページ生成速度アップ りん 04/10/26(火) 15:47
そこが時間食ってるのはわかってたんですが、なんとかせにゃと思いつつ、ついつい(^^; いや、申し訳ない。
いや、(遅くても)一応問題なく動いてる部分をいじるってのは結構怖いので…
ループの中も、かなり無駄な部分が多いので、チューニングかければここはもっと早くなると思いますです。
実は、対応する</ifが見付からなかった時、無限ループに陥るという問題もあったりするし…
なので、次回ここはちゃんと手を入れますです。スマソ。
いえいえ ヘンゼルの記憶 04/10/26(火) 17:14
とんでもないです(>_<)
もともと普通のスキンであれば数msで終わるところを、<if></if>の中膨らませ過ぎて遅くしちゃったの此方ですし(^^;
ここのとこ次々といろいろ改良していただいてますし、今後もいろいろ計画があるようですので、どうか無理はなさらずに♪

