2016-08-02 122 views
0

我做了一个小实验,并得到了一个令人惊讶的结果(至少对我来说)。我已经写了6个函数来以不同的方式在PHP中总结一个数组。在这里你可以看到的结果:PHP如何使用通过ref或value传递的参数?

PHP ver: 5.5.36 
foreach_by_value():  1.1668000221252 
foreach_by_ref():  0.38018989562988 
array_sum_by_value(): 0.11428999900818 
array_sum_by_ref():  0.91070008277893 
for_by_value():   0.50360298156738 
for_by_ref():   1.2752962112427 

正如你所看到的,通过引用传递数组有时使得快于其他情况下慢。 不知道背后的原因是什么。

这里是我用于测试的代码:

echo phpversion() . "\n"; 

const N = 100000; 
const REPEAT = 100; 

for ($i = 0;$i < N;$i++) { 
    $array[] = rand(0, 10000); 
} 

function foreach_by_value($a) { 
    $sum = 0; 
    foreach($a as $number) { 
     $sum += $number; 
    } 
} 

function foreach_by_ref(&$a) { 
    $sum = 0; 
    foreach($a as $number) { 
     $sum += $number; 
    } 
} 

function array_sum_by_value($a) { 
    $sum = array_sum($a); 
} 

function array_sum_by_ref(&$a) { 
    $sum = array_sum($a); 
} 

function for_by_value($array) { 
    $sum = 0; 
    $count = count($array); 
    for($i = 0;$i < $count;$i++) { 
     $sum += $array[$i]; 
    } 
} 

function for_by_ref(&$array) { 
    $sum = 0; 
    $count = count($array); 
    for($i = 0;$i < $count;$i++) { 
     $sum += $array[$i]; 
    } 
} 


$start_time = microtime(true); 
for ($i = 0;$i < REPEAT;$i++) { 
    foreach_by_value($array); 
} 
$finish_time = microtime(true); 
echo "foreach_by_value(): \t" . ($finish_time - $start_time) . "\n"; 

$start_time = microtime(true); 
for ($i = 0;$i < REPEAT;$i++) { 
    foreach_by_ref($array); 
} 
$finish_time = microtime(true); 
echo "foreach_by_ref(): \t" . ($finish_time - $start_time) . "\n"; 


$start_time = microtime(true); 
for ($i = 0;$i < REPEAT;$i++) { 
    array_sum_by_value($array); 
} 
$finish_time = microtime(true); 
echo "array_sum_by_value(): \t" . ($finish_time - $start_time) . "\n"; 

$start_time = microtime(true); 
for ($i = 0;$i < REPEAT;$i++) { 
    array_sum_by_ref($array); 
} 
$finish_time = microtime(true); 
echo "array_sum_by_ref(): \t" . ($finish_time - $start_time) . "\n"; 

$start_time = microtime(true); 
for ($i = 0;$i < REPEAT;$i++) { 
    for_by_value($array); 
} 
$finish_time = microtime(true); 
echo "for_by_value(): \t" . ($finish_time - $start_time) . "\n"; 

$start_time = microtime(true); 
for ($i = 0;$i < REPEAT;$i++) { 
    for_by_ref($array); 
} 
$finish_time = microtime(true); 
echo "for_by_ref(): \t\t" . ($finish_time - $start_time) . "\n"; 

回答

2
  • foreach_by_value - 循环枚举阵列和复制当前 值到临时变量$number,所以这需要额外的时间;
  • foreach_by_ref - 周期枚举数组并且不复制 任何东西,只需加上和;
  • array_sum_by_value - 内部功能 (用C++编写)列举了阵列和计算的总和,所以这种 是最快的结果;
  • array_sum_by_ref - 内部函数(用C++编写)枚举数组,但由于每个内部调用到next()是通过引用,这需要用于重定向额外的时间(对于该阵列的每个元素);
  • for_by_value - 它不使用任何临时变量,但因为它使用的索引,而不是current()next(),这需要比foreach_by_ref更多的时间;
  • for_by_ref - 由于函数的参数是通过引用传递的,所以对参数的每次访问都有一个重定向,并且需要时间;