php 匿名函数的效率问题

php中文网
发布: 2016-06-06 20:51:24
原创
1229人浏览过

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

$foo = create_function ('$a', 'return $a;');
登录后复制

立即学习PHP免费学习笔记(深入)”;

1.1.8PbootCMS
1.1.8PbootCMS

PbootCMS是一款高效、简洁、强悍的开源PHP企业网站开发建设管理系统。 PbootCMS 1.1.8 更新日志:2018-08-07 1.修复提交表单多选字段接收数据问题; 2.修复登录过程中二次登陆在页面不刷新时验证失败问题; 3.新增搜索结果fuzzy参数来控制是否模糊匹配; 4.新增父分类,顶级分类名称及链接独立标签,具体见手册; 5.新增内容多图拖动排序功能。

1.1.8PbootCMS 243
查看详情 1.1.8PbootCMS
$foo = function ($a) {return $a;};
登录后复制

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

for ($i=0; $i<10; $i++) {
    $foo = create_function ('$a', 'return $a;');
}
登录后复制

立即学习PHP免费学习笔记(深入)”;

for ($i=0; $i<10; $i++) {
    $foo = function ($a) {return $a;};
}
登录后复制

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

回复内容:

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

$foo = create_function ('$a', 'return $a;');
登录后复制

立即学习PHP免费学习笔记(深入)”;

$foo = function ($a) {return $a;};
登录后复制

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

for ($i=0; $i<10; $i++) {
    $foo = create_function ('$a', 'return $a;');
}
登录后复制

立即学习PHP免费学习笔记(深入)”;

for ($i=0; $i<10; $i++) {
    $foo = function ($a) {return $a;};
}
登录后复制

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

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

1 - with a "standard" function2 - with a lambda function3 - 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有多慢你就知道,同样的道理

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

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

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

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

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

$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

相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号