和区别就是第一段代码数组作为参数传递了,第二段是引用传递的。两者输出效果一样,不知道效率如何分辨?以及现在的php版本下还有必要这么写吗?
2 回答
慕神8447489
TA贡献1780条经验 获得超1个赞
官网上的说明Youcanpassavariablebyreferencetoafunctionsothefunctioncanmodifythevariable.引用的主要场景是为了在方法内修改体现在方法外的变量中。你的代码并不涉汲这个点。引用传递和值参递的主要区别也体现在对值的修改。那我们来测试一下效率,先看你的代码(因为打印太多会导致崩溃,稍作修改)functionmicrotime_float(){list($usec,$sec)=explode("",microtime());return((float)$usec+(float)$sec);}functionmyfun1($arr){$temp=$arr;}$arr=array(1,2,3,4,5);$start=microtime_float();echo'myfun1beginmem:'.memory_get_usage().PHP_EOL;//258176for($i=0;$i<100000;$i++){myfun1($arr);}echo'myfun1endmem:'.memory_get_usage().PHP_EOL;//258312echo'myfun1耗时:'.(microtime_float()-$start).PHP_EOL;//5.1625158786774functionmyfun2(&$arr){$temp=$arr;}$start=microtime_float();$arr1=array(1,2,3,4,5);echo'myfun2beginmem:'.memory_get_usage().PHP_EOL;//259256for($i=0;$i<100000;$i++){myfun2($arr1);}echo'myfun2endmem:'.memory_get_usage().PHP_EOL;//259256,引用不需要额外内存,有优势echo'myfun2耗时:'.(microtime_float()-$start).PHP_EOL;//5.1925080871582,多试几次,发现有时引用用户更长,有时值更长,但基本上差距不超过0.1秒。而如果arr有一万个元素的情况下,结果又有点变化了myfun1beginmem:1668184myfun1endmem:1668320myfun1耗时:5.0130000114441myfun2beginmem:1668320myfun2endmem:2599536myfun2耗时:65.369999885559下面再看看这段代码functionmyfun1($arr){$arr[0]++;return$arr;}$arr=array(1,2,3,4,5);$start=microtime_float();echo'myfun1beginmem:'.memory_get_usage().PHP_EOL;for($i=0;$i<100000;$i++){$arr=myfun1($arr);}echo'myfun1endmem:'.memory_get_usage().PHP_EOL;echo'myfun1耗时:'.(microtime_float()-$start).PHP_EOL;functionmyfun2(&$arr){$arr[0]++;}$start=microtime_float();$arr1=array(1,2,3,4,5);echo'myfun2beginmem:'.memory_get_usage().PHP_EOL;for($i=0;$i<100000;$i++){myfun2($arr1);}echo'myfun2endmem:'.memory_get_usage().PHP_EOL;echo'myfun2耗时:'.(microtime_float()-$start).PHP_EOL;执行结果myfun1beginmem:258288myfun1endmem:258424myfun1耗时:5.3175320625305myfun2beginmem:259360myfun2endmem:259360myfun2耗时:4.9064898490906差距就出来了,引用传递总是更快一点,放一个复杂的数据差距就更明显。$arr有一万个元素的情况下myfun1需要79.389000177383秒,myfun2只要5.0069999694824#####################再补充下,用php7跑了一遍,结果又不一样#######第一段代码,$arr一万个元素结果如下myfun1beginmem:876952myfun1endmem:876952myfun1耗时:0.016289949417114myfun2beginmem:876952myfun2endmem:876976myfun2耗时:0.018485069274902第二段代码,$arr一万个元素结果如下myfun1beginmem:876952myfun1endmem:1405392myfun1耗时:19.206958055496myfun2beginmem:1405392myfun2endmem:1405416myfun2耗时:0.023943901062012
慕少森
TA贡献2019条经验 获得超9个赞
真正的效率不是靠这些东西抠出来的,而是在你程序的实现方式。比如你写了一大堆同步IO阻塞在那里,你全都用引用也没什么用,反倒给自己挖坑。这点效率根本不值一提。
添加回答
举报
0/150
提交
取消