php 匿名函数的效率问题
$foo = create_function ('$a', 'return $a;');
和
$foo = function ($a) {return $a;};
这两种做法在分别是在什么时候创建函数体的呢?
如果在一个循环中,如下:
for ($i=0; $i和
for ($i=0; $i哪一种写法效率更高呢?
或者是,这样的写法和把匿名函数定义放在循环体外定义,循环内调用相比有没有区别呢?回复内容:
最近在看php的匿名函数,有这么几种用法
$foo = create_function ('$a', 'return $a;');和
$foo = function ($a) {return $a;};这两种做法在分别是在什么时候创建函数体的呢?
如果在一个循环中,如下:for ($i=0; $i和
for ($i=0; $i哪一种写法效率更高呢?
或者是,这样的写法和把匿名函数定义放在循环体外定义,循环内调用相比有没有区别呢?
事实胜于雄辩,引用一下曾经有人做过的测试:
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有多慢你就知道,同样的道理
用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'; echo $ctime-$btime,'
';代码执行结果:
0.0050528049468994
0.1806480884552
上一篇: 深度学习:前向传播和后向传播算法
推荐阅读
-
Mysql5.7中使用group concat函数数据被截断的问题完美解决方法
-
PHP的数组中提高元素查找与元素去重的效率的技巧解析
-
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
-
PHP字符串函数系列之nl2br(),在字符串中的每个新行 ( ) 之前插入 HTML 换行符br
-
PHP把数字转成人民币大写的函数分享
-
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
-
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
-
如何解决js函数防抖、节流出现的问题
-
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
-
PHP实现仿Google分页效果的分页函数