2013-05-03 53 views
0

這個問題是關於優化程序的一部分,我使用它作爲常用工具添加到許多項目中。 這個'模板解析器'被設計用來使用一種包含html代碼的文本模式或其他任何具有多個特定標籤的文本模式,並且在渲染時由開發人員給定值替換這些模板。Perf。問題/對字符串操作函數的調用太多

所涉及的幾類的確如預期大量的工作和工作,它可以讓需要隔離的設計元素和容易適應/替換設計塊時。

我用這個樣子的的模式(沒有例外,我承認):

<table class="{class}" id="{id}"> 
    <block_row> 
     <tr> 
      <block_cell> 
       <td>{content}</td> 
      </block_cell> 
     </tr> 
    </block_row> 
</table> 

(下面的示例代碼適用提取物)

解析做這樣的事情:

// Variables are sorted by position in pattern string 
// Position is read once and stored in cache to avoid 
// multiple calls to str_pos or str_replace 
foreach ($this->aVars as $oVar) { 
    $sString = substr($sString, 0, $oVar->start) . 
      $oVar->value . 
      substr($sString, $oVar->end); 
} 

// Once pattern loaded, blocks look like --¤(<block_name>)¤-- 
foreach ($this->aBlocks as $sName=>$oBlock) { 
    $sBlockData = $oBlock->parse(); 
    $sString = str_replace('--¤(' . $sName . ')¤--', $sBlockData, $sString); 
} 

通過使用我使用像「addBlock」或「SETVAR」方法的類的實例,以填補我的數據模式。

這個系統有幾個缺點,其中包括內存中的多個對象(每個塊的一個實例)以及在解析過程中有很多對字符串操作函數的調用的事實(過去的preg_replace,現在只是一個一羣substr和好朋友)。

上我的工作是製作大量使用這些模板,他們只是要告訴他們的界限的程序。

我的問題是下面的(無需代碼,只是想法或導致後續):

  • 我應該考慮我濫用這一點,並應儘量進行管理,這樣我不t需要對這些模板進行如此多的調用(例如,改進緩存,僅使用簡單的查看腳本...)

  • 您是否知道一種技術解決方案,爲數據提供不會是瘋狂資源消費者我寫了 ?在我寫作的時候,我正在考慮XSLT,它是否合適,如果可以,它可以提高性能?

預先感謝您的意見

回答

1

使用XDebug擴展分析代碼,並找出到底是哪部分代碼是最耗時。

+0

感謝您的回答。我已經做了,通過這和kCacheGrind我做了一些改進,儘管仍然有許多PHP內部函數的調用。我會嘗試一些我已經離開的想法,最後我可能會將這個類的使用限制在不會重複太多次的元素上。如果我找到另一個解決方案,我會在那裏發帖:)再次感謝。 – nicolas 2013-05-06 12:33:33