PHP:如何使 INVOKING 内部函数更快

Posted

技术标签:

【中文标题】PHP:如何使 INVOKING 内部函数更快【英文标题】:PHP: How to make INVOKING internal functions faster 【发布时间】:2020-08-05 00:23:36 【问题描述】:

我正在尝试优化一个在请求执行期间调用 560x 的函数。

功能如下(部分信息已编辑):

function foo($text) 
    if (preg_match('/[`"]/', $text)) 
        throw new Exception("very detailed error");
    
    $text = explode('.', $text);
    $tick = '*';
    return $tick . implode("$tick.$tick", $text) . $tick;

使用 XDEBUG php profiler + Webgrind,我看到这个函数的这些统计数据(以毫秒为单位):

如你所见,preg_matchexplodeimplode合并只花费了 3ms。剩下的 20 毫秒用于调用这些函数并连接一些字符串。有没有办法可以降低这个函数的总自身成本?

我已经尝试添加

use function preg_match;
use function explode;
use function implode;

按照here 的建议,但我没有看到任何改进。有什么建议吗?

【问题讨论】:

如果 87% 的时间都花在调用函数上,我们为什么要查看函数?我会考虑完全避免调用该函数的方法。 【参考方案1】:

考虑切换到更轻量级的函数(但可能会失去一些可读性):

function foo($text) 
    if (strpos($text, '"')!==FALSE || strpos($text, '`')!==FALSE) 
        throw new Exception("very detailed error");
    
    $tick = '*';
    return $tick . str_replace('.', "$tick.$tick", $text) . $tick;

【讨论】:

虽然从逻辑上讲这应该会减少延迟,因为它摆脱了正则表达式,实际上它实际上增加了约 3 毫秒,因为有一个额外的函数调用。除了实际函数的复杂性之外,函数调用有一个固定成本。这个固定成本是大部分延迟的来源

以上是关于PHP:如何使 INVOKING 内部函数更快的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CommonDataKinds.Phone 内部查询使此 ContactsContract.Contact 查询更快?

哪一个更快,为什么 - Php连接内部和外部的功能

无法使 PHP 函数在 PHP 内部的 HTML 中工作

如何使局部变量(在函数内部)全局[重复]

如何使电子邮件存在检查更快?

如何使用 PHP 扩展覆盖内部 Zend 函数?