【发布时间】:2011-05-01 21:38:00
【问题描述】:
你好。今天我写了一个小的基准脚本来比较复制变量和创建对它们的引用的性能。我期待,例如创建对大型数组的引用会比复制整个数组慢得多。这是我的基准代码:
<?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 所用的时间大约是 recursiveCopy 的 20 倍(!)。
有人可以解释这种 PHP 行为吗?
【问题讨论】:
-
除了不正确的递归之外,为什么还要麻烦递归呢?为什么不只是设置一个 for 循环并在每次迭代后取消设置变量(这将比递归调用具有更少的开销,并且不会占用你所有的内存)......但最终,差异会如此之小以至于在 99.9999% 的情况下,使用语义上适当的分配(在需要的地方引用,在不需要的地方正常)比尝试微优化更有意义。
-
这不是为了优化东西,我只是好奇。而且我使用了递归,因为我不想取消设置变量和循环等...编写递归要快得多,而且我不关心开销,因为两者都是一样的。跨度>
-
避免使用大型数组以获得良好的性能。就是这样。
标签: php reference benchmarking php-internals