我遇到了一些看起來像是奇怪的性能問題。運行此代碼:爲什麼在這段代碼中通過引用慢?
<?php
function test_ref(&$test)
{
for ($i = 0; $i < 100000; $i++)
{
$foo = "s" . rand(1, 1000);
if (!array_key_exists($foo, $test))
{
$test[$foo] = array();
}
$test[$foo][] = rand(1, 10);
}
}
function test()
{
$test = array();
for ($i = 0; $i < 100000; $i++)
{
$foo = "s" . rand(1, 1000);
if (!array_key_exists($foo, $test))
{
$test[$foo] = array();
}
$test[$foo][] = rand(1, 10);
}
return $test;
}
$scriptstart = microtime(true);
$test = array();
test_ref($test);
$sum = 0;
foreach ($test as $key => $val)
{
foreach ($val as $val2)
{
$sum += $val2;
}
}
echo "sum " . $sum . "<br>";
$scriptelapsed = microtime(true) - $scriptstart;
echo "time taken " . $scriptelapsed . "<br>";
$scriptstart = microtime(true);
$test = test();
$sum = 0;
foreach ($test as $key => $val)
{
foreach ($val as $val2)
{
$sum += $val2;
}
}
echo "sum " . $sum . "<br>";
$scriptelapsed = microtime(true) - $scriptstart;
echo "time taken " . $scriptelapsed . "<br>";
?>
我得到這些結果:
sum 548521
time taken 12.37544798851
sum 551236
time taken 0.29530310630798
這是怎麼回事?這似乎與我將子數組插入數組的事實有關,但我不明白爲什麼通過引用傳遞應該慢得多。
(這是在PHP版本5.3.3-7 + squeeze14用了Suhosin補丁0.9.9.1)
(編輯:使用未設置變量固定的,還是一樣的結果)
哪裏'$ array'來從? –
按價值歸還不是免費的。 –
我不知道答案(但我有興趣瞭解它),但我會注意到PHP中的引用不是指針。它們實際上是一種間接的層面。因此,通過使用參考,解釋器必須先查找參考,然後查找參考值。沒有參考,它少了一步。這可能是你在這裏看到的放緩的原因。 – troelskn