【问题标题】:Perf. issue / Too much calls to string manipulation functions性能。问题/对字符串操作函数的调用过多
【发布时间】:2014-09-23 21:44:34
【问题描述】:

这个问题是关于优化我用来添加到许多项目中作为常用工具的程序的一部分。 这个“模板解析器”旨在使用一种包含 html 代码或其他任何带有几个特定标签的文本模式,并在呈现时用开发人员给定的值替换它们。

所涉及的少数类做得很好并且按预期工作,它允许在需要时隔离设计元素并轻松调整/替换设计块。

我使用的模式看起来像这样(我承认没有什么特别的):

<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 和 pals)。

我正在处理的程序正在大量使用这些模板,它们即将显示出它们的极限。

我的问题如下(不需要代码,只需想法或线索即可):

    1234563
  • 您是否知道一种技术解决方案来为结构提供数据,而不是我写的那种疯狂的资源消耗者?在我写作时,我正在考虑 XSLT,它是否合适,如果可以,它会提高性能吗?

提前感谢您的建议

【问题讨论】:

    标签: php string templates optimization


    【解决方案1】:

    使用 XDebug 扩展来分析您的代码并准确找出代码的哪些部分花费的时间最多。

    【讨论】:

    • 感谢您的回答。我已经这样做了,并且通过 kCacheGrind 我做了一些改进,尽管仍然有许多 php 内部函数的调用。我会尝试我留下的一些想法,最后我可能会将此类的使用限制在不会重复太多次的元素上。如果我找到其他解决方案,我会在那里发布:) 再次感谢。
    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多