Home  >  Article  >  Backend Development  >  php 匿名函数的效率问题

php 匿名函数的效率问题

WBOY
WBOYOriginal
2016-06-06 20:51:241033browse

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

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

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

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

for ($i=0; $i<p>和</p><pre class="brush:php;toolbar:false">for ($i=0; $i<p>哪一种写法效率更高呢?<br>
或者是,这样的写法和把匿名函数定义放在循环体外定义,循环内调用相比有没有区别呢?</p>
                            
                        


                                                                                                                        
                     <h2>回复内容:</h2>
                      
                                                            <p>最近在看php的匿名函数,有这么几种用法</p><pre class="brush:php;toolbar:false">$foo = create_function ('$a', 'return $a;');

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

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

for ($i=0; $i<p>和</p><pre class="brush:php;toolbar:false">for ($i=0; $i<p>哪一种写法效率更高呢?<br>
或者是,这样的写法和把匿名函数定义放在循环体外定义,循环内调用相比有没有区别呢?</p>
                            
                        
            <p class="answer fmt" data-id="1020000000143773">
                                    </p><p>事实胜于雄辩,引用一下曾经有人做过的测试:</p><blockquote>1 - with a "standard" function<br>2 - with a lambda function<br>3 - by using create_function()</blockquote><blockquote>For 50, 000 iterations on my laptop, here are the time spent for each implementation:</blockquote><blockquote>1 - 240 ms<br>2 - 200 ms<br>3 -1200 ms</blockquote><p>看得出来lambda跟直接写function的速度相当,比用create_function快很多</p><p>另外从内核代码里看create_function方法调用了zend_execute_API.c里的zend_eval_stringl方法相当于将函数体字符串参数在执行时再次解析以及编译一遍,在编译前还有准备工作要做,想想eval有多慢你就知道,同样的道理</p>
                            
            <p class="answer fmt" data-id="1020000000143749">
                                    </p><p>用create_function的话,实际上是每次调用这个函数,由它来创建一个新的函数($foo每次指向不同的函数)。</p><p>对于匿名函数,php实际上会创建一个全局的匿名函数,$foo每次只是引用它而已。用vld看php的opcode可以发现:</p><blockquote>ZEND_DECLARE_LAMBDA_FUNCTION                             '%00%7Bclosure%7D%2Ftmp%2Fphp%2F1.php0x7fad37b0b035'</blockquote><p>比较起来,理论上匿名函数是效率要高的。</p><p>另外,写在外面的话,也许效率能更高一点,但是对于php来说,真不差这一点。</p>
                            
            <p class="answer fmt" data-id="1020000000143839">
                                    </p><pre class="brush:php;toolbar:false">$atime=microtime(true);

$count=10000;

for($i=0;$i';
echo $ctime-$btime,'<br>';

代码执行结果:
0.0050528049468994
0.1806480884552

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn