引用传递与值传递

看代码:

<?php
define("N", 10000);
define("n", 10000);
ini_set('memory_limit', '1G');
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

function printArray0(&$arr) //引用传递
{
   $arr[0] = rand(0,9);
   return ;
}
function printArray1($arr)   //值传递
{
   $arr[0] = rand(0,9);
   return;
}

for($i=0 ; $i < N; $i++)
$arr[] = rand(0,N);

$start = microtime_float();
for($i=0;$i<n;$i++){
    printArray0($arr);
//    $b[] = &$arr;
}
$end = microtime_float();
echo "NO1:",$end - $start,"<br>";

for($i=0 ; $i < N; $i++)
$a[] = rand(0,N);
$start1 = microtime_float();
for($i=0;$i<n;$i++){
    printArray1($a);
//    $c[] = $a;
}
$end1 = microtime_float();
echo "NO2:",$end1 - $start1,"<br>";

?>

在没有任何改变数组值得操作时(如注释掉:$arr[0] = rand(0,9);),两次耗时基本无差别。

但一旦有改变数组值得操作时,值传递耗时大大增加,而对引用传递的耗时影响不大。

值传递copy-on-write,引用传递change-on-write。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值