Maison > développement back-end > tutoriel php > php 匿名函数的效率问题

php 匿名函数的效率问题

WBOY
Libérer: 2016-06-06 20:51:24
original
1063 Les gens l'ont consulté

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

$foo = create_function ('$a', 'return $a;');
Copier après la connexion

$foo = function ($a) {return $a;};
Copier après la connexion
Copier après la connexion

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

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


                                                                                                                        
                     <h2>回复内容:</h2>
                      
                                                            <p>最近在看php的匿名函数,有这么几种用法</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$foo = create_function ('$a', 'return $a;');
Copier après la connexion

$foo = function ($a) {return $a;};
Copier après la connexion
Copier après la connexion

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

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>';
Copier après la connexion

代码执行结果:
0.0050528049468994
0.1806480884552

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal