嘿那裏。今天我寫了一個小型的基準測試腳本來比較複製變量的性能與創建對它們的引用。我期待的是,例如創建對大數組的引用會比複製整個數組慢得多。這裏是我的基準代碼:(!)PHP性能:複製與參考
<?php
$array = array();
for($i=0; $i<100000; $i++) {
$array[] = mt_rand();
}
function recursiveCopy($array, $count) {
if($count === 1000)
return;
$foo = $array;
recursiveCopy($array, $count+1);
}
function recursiveReference($array, $count) {
if($count === 1000)
return;
$foo = &$array;
recursiveReference($array, $count+1);
}
$time = microtime(1);
recursiveCopy($array, 0);
$copyTime = (microtime(1) - $time);
echo "Took " . $copyTime . "s \n";
$time = microtime(1);
recursiveReference($array, 0);
$referenceTime = (microtime(1) - $time);
echo "Took " . $referenceTime . "s \n";
echo "Reference/Copy: " . ($referenceTime/$copyTime);
實際結果我得到的是,該recursiveReference花了大約20倍,只要recursiveCopy。
有人可以解釋這個PHP行爲嗎?
除了不正確的遞歸,爲什麼麻煩遞歸呢?爲什麼不在每次迭代之後設置一個for循環並取消設置變量(與遞歸調用相比,FAR的開銷更小,而且不會消耗掉所有的內存)......但最終的差距會非常小在99.9999%的情況下,使用語義上適當的賦值(參考,你需要一個,在你不需要的地方是正常的)而不是嘗試微觀優化更合理。 – ircmaxell 2010-10-28 14:04:34
這不是關於試圖優化的東西,我只是好奇。而且我使用遞歸,因爲我不想解除變量和循環等等。寫遞歸的速度要快得多,而且我並不關心開銷,因爲它們在兩者中都是相同的。 – fresskoma 2010-10-28 14:13:39
只需避免大型陣列獲得良好的性能。就這樣。 – 2010-10-28 14:28:50