Movable Type mt:具有插值类别的条目极其缓慢

时间:2013-04-12 08:29:09

标签: profiling movabletype

我有一个在Movable Type 5.2上运行的网站,我正在尝试简化我的一些模板,其中涉及根据属于另一个类别的当前类别中的条目进行过滤。

这个模板片段(作为索引模板构建,只打印出每个类别中第一个条目的标题,也是漫画类别中),构建速度非常快(1-2秒),尽管它有点缺憾:

<mt:Categories>
 <mt:SetVar name="show" value="1">
 <mt:Entries sort_order="ascend" limit="3">
  <mt:IfCategory label="Comic">
  <mt:If var="show" eq="1">
    Hello, <$mt:EntryTitle$>
    <mt:SetVar name="show" value="0">
  </mt:If>
  </mt:IfCategory>
 </mt:Entries>
</mt:Categories>

我决定使用变量插值来简化它,最终需要142秒来构建:

<mt:Categories>
 <$mt:CategoryLabel setvar="topCat"$>
 <mt:Entries sort_order="ascend" limit="1" category="$topCat AND Comic">
  Hello, <$mt:EntryTitle$>
 </mt:Entries>
</mt:Categories>

如果我使用<mt:SetVarBlock name="allCats"><$mt:EntryCategory$> AND Comic</mt:SetVarBlock>并在category="$allCats"代码上使用<mt:Entries>,那么构建也需要很长时间。

有谁知道这里发生了什么,以及如何让事情变得更快?我还有一些其他模板,理论上可以从这些代码简化中受益(特别是,我希望进一步限制到仅在一个附加类别中的条目的类别模板)但最终花费太长时间来构建它们到位

有没有一种很好的方法来分析MT以找出问题在其代码中的位置?我并不害怕Perl,但我也不知道它有哪些分析工具。

1 个答案:

答案 0 :(得分:2)

分析MT

你可以查看这篇文章:http://www.movabletype.org/2008/10/making_it_easier_to_debug_and_test_your_templates.html

我没有用5.X,所以我不能告诉你它是否仍然有用,但我很想知道。

模板示例

使用包含15,000个条目和20个类别的测试博客,我无法让您的第一个代码块正常工作。首先,我希望您需要测试所有条目,而不仅仅是最后3条,以确保结果是严格的。也许真正的旧条目是第一个共享这两个类别的条目。

我修改这两个代码块有点让我觉得什么是你想要的,列出还共享一个给定的类别中的每个类别中的最后一个条目(在你的情况下输出,“漫画”,但在我的测试中,“顶故事“)。

在我的5.13安装,我发现有之间的差mt:EntryIfCategorymt:IfCategory {尽管{3}},说明前者以有利于后者的已弃用。

当我运行此代码时:

<mt:Categories>
  <mt:Var name="show" value="1">
  <mt:Entries lastn="99999">
  <mt:If var="show" eq="1">
    <mt:IfCategory label="Top Story">
Hello, <$mt:EntryTitle$>
      <mt:Var name="show" value="0">
    </mt:IfCategory>
  </mt:If>
  </mt:Entries>
</mt:Categories>

我只获得Categories次迭代之一的输出,其中外部类别与内部类别匹配。我在想IfCategory正在测试外部Category循环的类别而不是内部Entries循环的类别。当我改为EntryIfCategory时,它按预期工作。

所以我的最终代码就是这个(包括我用于计时的一堆代码):

<mt:Section regex_replace="/^[\s]*$/mg","" regex_replace="/\n\n/mg","\n">
<mt:SetVarTemplate name="timingstart">
  <$mt:Date format="%H" setvar="hours"$>
  <$mt:Date format="%M" setvar="minutes"$>
  <$mt:Date format="%S" setvar="seconds"$>
  <$mt:Var name="hours" op="*" value="3600" setvar="hourseconds"$>
  <$mt:Var name="minutes" op="*" value="60" setvar="minuteseconds"$>
  <$mt:Var name="totalseconds" value="$hourseconds"$>
  <$mt:Var name="totalseconds" op="+" value="$minuteseconds" setvar="totalseconds"$>
  <$mt:Var name="totalseconds" op="+" value="$seconds" setvar="totalseconds"$>
  <$mt:Var name="totalseconds" setvar="startseconds"$>
</mt:SetVarTemplate>
<mt:SetVarTemplate name="timingstop">
  <$mt:Date format="%H" setvar="hours"$>
  <$mt:Date format="%M" setvar="minutes"$>
  <$mt:Date format="%S" setvar="seconds"$>
  <$mt:Var name="hours" op="*" value="3600" setvar="hourseconds"$>
  <$mt:Var name="minutes" op="*" value="60" setvar="minuteseconds"$>
  <$mt:Var name="totalseconds" value="$hourseconds"$>
  <$mt:Var name="totalseconds" op="+" value="$minuteseconds" setvar="totalseconds"$>
  <$mt:Var name="totalseconds" op="+" value="$seconds" setvar="totalseconds"$>
  <$mt:Var name="totalseconds" setvar="finishseconds"$>
  <$mt:Var name="finishseconds" op="-" value="$startseconds" setvar="elapsedseconds">
This code block completed in <mt:If name="elapsedseconds" eq="0">less than 1 second<mt:Else name="elapsedseconds" eq="1">1 second<mt:Else><$mt:Var name="elapsedseconds"$> seconds</mt:If>.
</mt:SetVarTemplate>
++++++++++++++++++++++++++++++++++++++++++
<$mt:Var name="timingstart"$>
<mt:Categories>
  <mt:Var name="show" value="1">
  <mt:Entries lastn="99999">
  <mt:If var="show" eq="1">
    <mt:EntryIfCategory label="Top Story">
Hello, <$mt:EntryTitle$>
      <mt:Var name="show" value="0">
    </mt:EntryIfCategory>
  </mt:If>
  </mt:Entries>
</mt:Categories>
<$mt:Var name="timingstop"$>
++++++++++++++++++++++++++++++++++++++++++
<$mt:Var name="timingstart"$>
<mt:Categories>
 <mt:SetVarBlock name="cats"><$mt:CategoryLabel$> AND Top Story</mt:SetVarBlock>
 <mt:Entries lastn="1" category="$cats">
Hello, <$mt:EntryTitle$>
 </mt:Entries>
</mt:Categories>
<$mt:Var name="timingstop"$>
++++++++++++++++++++++++++++++++++++++++++
</mt:Section>

我的输出在两个块中匹配:

  

++++++++++++++++++++++++++++++++++++++++++
  你好,曲棍球溜冰场得到绿灯
  你好,法官打击集体谈判法   你好,ALRC探索市中心的酒吧   你好,法官打击集体谈判法   您好,无证学生:州内学费对1名学生来说意味着什么   你好,为了一个好的结果冻结了   你好,Dems推动沃克在医疗保健计划上   你好,学生会接受WISPIRG立法   您好,UW校园选民身份证可能带来的好处和弊端   你好,Rally激起人群重新夺回Wis   你好,主要的冬季风暴席卷了麦迪逊   您好,照片:毕业,2011级   你好,奥巴马星期一访问麦迪逊   您好,ASM准备承担最终的MCSC申诉   你好,奥巴马星期一访问麦迪逊   你好,共和党领导任命约翰逊为3个主要委员会   您好,Jamie Thomson获得全球胚胎研究奖   您好,特遣部队推荐新板坯   你好,学院权衡人力资源重新设计计划
  你好,Rally激起人群重新夺回Wis   此代码块在18秒内完成   ++++++++++++++++++++++++++++++++++++++++++
  你好,曲棍球溜冰场得到绿灯
  你好,法官打击集体谈判法   你好,ALRC探索市中心的酒吧   你好,法官打击集体谈判法   您好,无证学生:州内学费对1名学生来说意味着什么   你好,为了一个好的结果冻结了   你好,Dems推动沃克在医疗保健计划上   你好,学生会接受WISPIRG立法   您好,UW校园选民身份证可能带来的好处和弊端   你好,Rally激起人群重新夺回Wis   你好,主要的冬季风暴席卷了麦迪逊   您好,照片:毕业,2011级   你好,奥巴马星期一访问麦迪逊   您好,ASM准备承担最终的MCSC申诉   你好,奥巴马星期一访问麦迪逊   你好,共和党领导任命约翰逊为3个主要委员会   您好,Jamie Thomson获得全球胚胎研究奖   您好,特遣部队推荐新板坯   你好,学院权衡人力资源重新设计计划
  你好,Rally激起人群重新夺回Wis   此代码块在12秒内完成   ++++++++++++++++++++++++++++++++++++++++++++++++++++++

注意,在此安装中,第二个块比第一个块快了大约三分之一。为了与你的152秒的价值进行比较,这是20个类别和15,000个条目的10倍,我需要更多地了解你有多少类别和条目。