Ниже приведен тест петли php foreach большого массива, я думал, что если $v
не изменится, реальная копия не произойдет из-за копирования при записи, но почему он быстро проходит по ссылке?
Код 1:
function test1($a){
$c = 0;
foreach($a as $v){ if($v=='xxxxx') ++$c; }
}
function test2(&$a){
$c = 0;
foreach($a as $v){ if($v=='xxxxx') ++$c; }
}
$x = array_fill(0, 100000, 'xxxxx');
$begin = microtime(true);
test1($x);
$end1 = microtime(true);
test2($x);
$end2 = microtime(true);
echo $end1 - $begin . "\n"; //0.03320002555847
echo $end2 - $end1; //0.02147388458252
Но на этот раз использование pass by reference медленное.
Код 2:
function test1($a){
$cnt = count($a); $c = 0;
for($i=0; $i<$cnt; ++$i)
if($a[$i]=='xxxxx') ++$c;
}
function test2(&$a){
$cnt = count($a); $c = 0;
for($i=0; $i<$cnt; ++$i)
if($a[$i]=='xxxxx') ++$c;
}
$x = array_fill(0, 100000, 'xxxxx');
$begin = microtime(true);
test1($x);
$end1 = microtime(true);
test2($x);
$end2 = microtime(true);
echo $end1 - $begin . "\n"; //0.024326801300049
echo $end2 - $end1; //0.037616014480591
Может кто-нибудь объяснить, почему передача по ссылке выполняется быстрее в коде1, но медленнее в коде2?
Edit:
С кодом 2 значение count($a)
делает основное различие, поэтому время цикла занимает почти одно и то же.