這個問題是關於優化程序的一部分,我使用它作爲常用工具添加到許多項目中。 這個'模板解析器'被設計用來使用一種包含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,它是否合適,如果可以,它可以提高性能?
預先感謝您的意見
感謝您的回答。我已經做了,通過這和kCacheGrind我做了一些改進,儘管仍然有許多PHP內部函數的調用。我會嘗試一些我已經離開的想法,最後我可能會將這個類的使用限制在不會重複太多次的元素上。如果我找到另一個解決方案,我會在那裏發帖:)再次感謝。 – nicolas 2013-05-06 12:33:33