18910140161

php闭包和回调函数?简单比较:PHP函数、闭包性能

顺晟科技

2022-10-21 13:32:06

243

今天终于忍受不了 EA 插件的某个提示了:

[EA] This closure can be declared as static (better scoping; in some cases can improve performance).

脑海第一反应是:Static 不是会占用内存吗?它们的效率如何呢?

顺手搜到了这位老哥的代码片段:

PHP performance: function vs closures - Gist

create_function() 的代码已经被官方废弃了,顺手修改:

<?php  
$iter = 10000000;  
  
$start = microtime(true);  
function funcK($item) { return $item; };  
for ($i = 0; $i < $iter; $i++)  
{  
    funcK($i);  
}  
$end = microtime(true) - $start;  
echo "Defined function: ".PHP_EOL;  
echo "$end seconds\n".PHP_EOL;  
  
$start = microtime(true);  
$fn = function($item) { return $item; };  
for ($i = 0; $i < $iter; $i++)  
{  
    $fn($i);  
}  
$end = microtime(true) - $start;  
unset($fn);  
echo "Closure function: ".PHP_EOL;  
echo "$end seconds\n".PHP_EOL;  
  
$start = microtime(true);  
$fn = static function($item) { return $item; };  
for ($i = 0; $i < $iter; $i++)  
{  
    $fn($i);  
}  
$end = microtime(true) - $start;  
echo "Closure static function: ".PHP_EOL;  
echo "$end seconds\n".PHP_EOL;

顺手跑一下:

Defined function:
0.27448701858521 seconds

Closure function:
0.33962607383728 seconds

Closure static function:
0.33882212638855 seconds

多顺手几次——结果基本一致。

经过一溜烟的顺手操作,基本确定这俩性能很接近。

当然,PHP8.1 时,对定义好的 Function 调用效率仍然超过其他两位。

最后,各语言在处理面向对象时,其 static 基本上是基于 Class 而占用内存,当我们使用命名空间和懒加载时,理论上将规避 过多的 static 引入 问题。

可以参考这里:

Does using static methods and properties in PHP use less memory?
相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航