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_match
、explode
、implode
合并只花费了 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 查询更快?