本文へジャンプ

Movable Type 再構築高速化 考察(1)
~再構築に時間がかかる原因を探る~

Movable Type 再構築高速化 考察

Movable Typeで記事が増えてきたりすると、管理画面が重い、再構築に時間がかかるというハナシがでてきたりします。

これらの原因はいくつかあるのですが、今回はテンプレートの記述の仕方に注目してみたいと思います。

再構築にかかる時間

記事を更新すると、その時点でいくつかのテンプレートに再構築が実行されます。
再構築の時間が短いほど体感的に早くなったと感じることができるでしょう。

なので、テンプレートの記述の仕方でどれくらい再構築に時間がかかるかを調べてみます。
計測には「MTSpeedMeter」プラグインを使用しました。

記事を普通に出力してみる

まずは、記事数が約1500件ほどのブログで、<mt:Entries>を3回出力してみます。

1:9.63901400566101
2:9.55511212348938
3:9.67439603805542
平均:9.622840722401937

再構築にかかった時間は、平均で「9.622840722401937」秒でした。
ちなみに、<mt:Entries>が1回だと平均「3.948484659194947」秒でした。

<mt:Entries>の回数を増やすと、比例的に処理時間も増えました。

<mt:SpeedMeter name="ブログ記事の一覧" prefix='<div class="debug">' suffix='</div>'>

<mt:Entries lastn="0">
[<$mt:EntryID$>:<$mt:EntryTitle$>]
</mt:Entries>
<mt:Entries lastn="0">
[<$mt:EntryID$>:<$mt:EntryTitle$>]
</mt:Entries>
<mt:Entries lastn="0">
[<$mt:EntryID$>:<$mt:EntryTitle$>]
</mt:Entries>

</mt:SpeedMeter>

配列化してみる

今度は、<mt:Entries>を1回に変更して、出力されたデータを配列にします。
その配列を<mt:Loop>で3回展開してみました。

1:4.13107514381409
2:4.15068912506104
3:4.14892315864563
平均:4.143562475840253

結果は、平均「4.143562475840253」秒でした。
ちなみに<mt:Loop>の回数を変更しても、ほぼ時間は変わりませんでした。

<mt:SpeedMeter name="ブログ記事の一覧" prefix='<div class="debug">' suffix='</div>'>

<mt:Entries lastn="0">
<mt:SetVarBlock name="sample" function="push"> [<$mt:EntryID$>:<$mt:EntryTitle$>]</mt:SetVarBlock>
</mt:Entries>
<mt:Loop name="sample"><mt:Var name="__value__"></mt:Loop>
<mt:Loop name="sample"><mt:Var name="__value__"></mt:Loop>
<mt:Loop name="sample"><mt:Var name="__value__"></mt:Loop>

</mt:SpeedMeter>

データベースへのアクセスを増やしてみる

今度は、出力する値(記事IDと記事タイトルの2つから、5つ)を増やしてみます。

1:11.1675078868866
2:11.2783050537109
3:11.2834129333496
平均:11.2430752913157

そうすると結果は、「11.2430752913157」となり、
増やす前の「9.62」秒から約「1.62」秒ほど増えました。

データベースとのやり取りが増えると処理も重くなるんですね。

<mt:SpeedMeter name="ブログ記事の一覧" prefix='<div class="debug">' suffix='</div>'>

<mt:Entries lastn="0">
[<$mt:EntryID$>:<$mt:EntryTitle$>:<$mt:EntryLink$>:<$mt:EntryDate$>:<$mt:EntryBody$>]
</mt:Entries>
<mt:Entries lastn="0">
[<$mt:EntryID$>:<$mt:EntryTitle$>:<$mt:EntryLink$>:<$mt:EntryDate$>:<$mt:EntryBody$>]
</mt:Entries>
<mt:Entries lastn="0">
[<$mt:EntryID$>:<$mt:EntryTitle$>:<$mt:EntryLink$>:<$mt:EntryDate$>:<$mt:EntryBody$>]
</mt:Entries>

</mt:SpeedMeter>

データベースへのアクセスを増やしてみる@配列版

<mt:Loop>版も同様に変更してみました。

結果は、 1:4.89078998565674
2:4.93412303924561
3:4.93477916717529
平均:4.919897397359213

約「4.14」秒 → 約「4.93」秒に増えました。
増えた文は初回の<mt:Entries>の分でしょうね。

<mt:SpeedMeter name="ブログ記事の一覧" prefix='<div class="debug">' suffix='</div>'>

<mt:Entries lastn="0">
<mt:SetVarBlock name="sample" function="push">[<$mt:EntryID$>:<$mt:EntryTitle$>:<$mt:EntryLink$>:<$mt:EntryDate$>:<$mt:EntryBody$>]</mt:SetVarBlock>
</mt:Entries>
<mt:Loop name="sample"><mt:Var name="__value__"></mt:Loop>
<mt:Loop name="sample"><mt:Var name="__value__"></mt:Loop>
<mt:Loop name="sample"><mt:Var name="__value__"></mt:Loop>

</mt:SpeedMeter>

まとめ

調査した結果、

  • データベースとのやり取りが増えるほど処理に時間を食う
  • 一度変数に格納すれば、値を取り出す際に処理に時間を食わない

ということがわかりました。

再構築の時間を減らすには、データベースからの値の取得は極力少なくするのがカギとなります。

Recent Entries
MD EVENT REPORT
What's Hot?