为什么 PHP 函数调用 *so* 很昂贵?
PHP 中的函数调用成本很高。这里有一个小的基准测试来测试它:
<?php
const RUNS = 1000000;
// create test string
$string = str_repeat('a', 1000);
$maxChars = 500;
// with function call
$start = microtime(true);
for ($i = 0; $i < RUNS; ++$i) {
strlen($string) <= $maxChars;
}
echo 'with function call: ', microtime(true) - $start, "\n";
// without function call
$start = microtime(true);
for ($i = 0; $i < RUNS; ++$i) {
!isset($string[$maxChars]);
}
echo 'without function call: ', microtime(true) - $start;
这首先使用函数()测试功能相同的代码,然后不使用函数(不是函数)。strlen
isset
我得到以下输出:
with function call: 4.5108239650726
without function call: 0.84017300605774
如您所见,使用函数调用的实现比不调用任何函数的实现慢五(5.38)倍以上。
我想知道为什么函数调用如此昂贵。主要瓶颈是什么?是哈希表中的查找吗?或者什么这么慢?
我重新访问了这个问题,并决定再次运行基准测试,XDebug完全禁用(而不仅仅是禁用分析)。这表明,我的测试相当复杂,这一次,我得到了10000000次运行:
with function call: 3.152988910675
without function call: 1.4107749462128
这里,仅函数调用的速度大约是 (2.23) 的两倍,因此差异要小得多。
我刚刚在PHP 5.4.0快照上测试了上述代码,并得到了以下结果:
with function call: 2.3795559406281
without function call: 0.90840601921082
在这里,差异再次略大(2.62)。(但就目前而言,这两种方法的执行时间都大幅下降)。