php 匿名函数的效率问题

发布于 2022-08-24 11:15:07 字数 426 浏览 14 评论 0

最近在看php的匿名函数,有这么几种用法

$foo = create_function ('$a', 'return $a;');

$foo = function ($a) {return $a;};

这两种做法在分别是在什么时候创建函数体的呢?
如果在一个循环中,如下:

for ($i=0; $i<10; $i++) {
    $foo = create_function ('$a', 'return $a;');
}

for ($i=0; $i<10; $i++) {
    $foo = function ($a) {return $a;};
}

哪一种写法效率更高呢?
或者是,这样的写法和把匿名函数定义放在循环体外定义,循环内调用相比有没有区别呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

雪若未夕 2022-08-31 11:15:07

事实胜于雄辩,引用一下曾经有人做过的测试:

1 - with a "standard" function
2 - with a lambda function
3 - by using create_function()

For 50, 000 iterations on my laptop, here are the time spent for each implementation:

1 - 240 ms
2 - 200 ms
3 -1200 ms

看得出来lambda跟直接写function的速度相当,比用create_function快很多

另外从内核代码里看create_function方法调用了zend_execute_API.c里的zend_eval_stringl方法相当于将函数体字符串参数在执行时再次解析以及编译一遍,在编译前还有准备工作要做,想想eval有多慢你就知道,同样的道理

瞄了个咪的 2022-08-31 11:15:07

用create_function的话,实际上是每次调用这个函数,由它来创建一个新的函数($foo每次指向不同的函数)。

对于匿名函数,php实际上会创建一个全局的匿名函数,$foo每次只是引用它而已。用vld看php的opcode可以发现:

ZEND_DECLARE_LAMBDA_FUNCTION '%00%7Bclosure%7D%2Ftmp%2Fphp%2F1.php0x7fad37b0b035'

比较起来,理论上匿名函数是效率要高的。

另外,写在外面的话,也许效率能更高一点,但是对于php来说,真不差这一点。

∞梦里开花 2022-08-31 11:15:07
$atime=microtime(true);

$count=10000;

for($i=0;$i<$count;$i++){
	$f=function($a){return $a;};
}

$btime=microtime(true);

for($i=0;$i<$count;$i++){
	$f2=create_function('$a','return $a;');
}

$ctime=microtime(true);
echo $btime-$atime,'<br>';
echo $ctime-$btime,'<br>';

代码执行结果:
0.0050528049468994
0.1806480884552

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文