看代码:
<?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。