博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php 匿名函数 性能,php 匿名函数的效率问题
阅读量:5935 次
发布时间:2019-06-19

本文共 1469 字,大约阅读时间需要 4 分钟。

最近在看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;};

}

哪一种写法效率更高呢?

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

回复内容:

最近在看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;};

}

哪一种写法效率更高呢?

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

事实胜于雄辩,引用一下曾经有人做过的测试: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

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

你可能感兴趣的文章
实现一个平行四边形
查看>>
领域驱动设计,构建简单的新闻系统,20分钟够吗?
查看>>
web安全问题分析与防御总结
查看>>
React 组件通信之 React context
查看>>
ZooKeeper 可视化监控 zkui
查看>>
Linux下通过配置Crontab实现进程守护
查看>>
ios 打包上传Appstore 时报的错误 90101 90149
查看>>
Oracle推出轻量级Java微服务框架Helidon
查看>>
密码概述
查看>>
nagios+nrpe监控配置错误日志集
查看>>
JavaScript应用开发实践指南迷你书
查看>>
autoconf,automake,libtool
查看>>
jQuery的技巧01
查看>>
基于泛型实现的ibatis通用分页查询
查看>>
gopacket 使用
查看>>
AlertDialog对话框
查看>>
我的友情链接
查看>>
办公室几台电脑怎么连一台打印机的具体步骤
查看>>
linux安全---cacti+ntop监控
查看>>
鸟哥的linux私房菜-shell简单学习-1
查看>>