为了账号安全,请及时绑定邮箱和手机立即绑定

这2段PHP的代码效率一样吗?如何测试?毕竟php一直在升级,不知道现状如何?

这2段PHP的代码效率一样吗?如何测试?毕竟php一直在升级,不知道现状如何?

临摹微笑 2019-05-25 14:00:09
和区别就是第一段代码数组作为参数传递了,第二段是引用传递的。两者输出效果一样,不知道效率如何分辨?以及现在的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;//258176
for($i=0;$i<100000;$i++){
myfun1($arr);
}
echo'myfun1endmem:'.memory_get_usage().PHP_EOL;//258312
echo'myfun1耗时:'.(microtime_float()-$start).PHP_EOL;//5.1625158786774
functionmyfun2(&$arr)
{
$temp=$arr;
}
$start=microtime_float();
$arr1=array(1,2,3,4,5);
echo'myfun2beginmem:'.memory_get_usage().PHP_EOL;//259256
for($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:1668184
myfun1endmem:1668320
myfun1耗时:5.0130000114441
myfun2beginmem:1668320
myfun2endmem:2599536
myfun2耗时: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:258288
myfun1endmem:258424
myfun1耗时:5.3175320625305
myfun2beginmem:259360
myfun2endmem:259360
myfun2耗时:4.9064898490906
差距就出来了,引用传递总是更快一点,放一个复杂的数据差距就更明显。$arr有一万个元素的情况下myfun1需要79.389000177383秒,myfun2只要5.0069999694824
#####################再补充下,用php7跑了一遍,结果又不一样#######第一段代码,$arr一万个元素结果如下
myfun1beginmem:876952
myfun1endmem:876952
myfun1耗时:0.016289949417114
myfun2beginmem:876952
myfun2endmem:876976
myfun2耗时:0.018485069274902
第二段代码,$arr一万个元素结果如下
myfun1beginmem:876952
myfun1endmem:1405392
myfun1耗时:19.206958055496
myfun2beginmem:1405392
myfun2endmem:1405416
myfun2耗时:0.023943901062012
                            
查看完整回答
反对 回复 2019-05-25
?
慕少森

TA贡献2019条经验 获得超9个赞

真正的效率不是靠这些东西抠出来的,而是在你程序的实现方式。比如你写了一大堆同步IO阻塞在那里,你全都用引用也没什么用,反倒给自己挖坑。这点效率根本不值一提。
                            
查看完整回答
反对 回复 2019-05-25
  • 2 回答
  • 0 关注
  • 288 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信