【问题标题】:How does PHP use the parameters passed by ref or value?PHP如何使用ref或value传递的参数?
【发布时间】:2016-12-07 14:31:53
【问题描述】:

我做了一个小实验,得到了一个令人惊讶的结果(至少对我来说)。我已经编写了 6 个函数来以不同的方式在 PHP 中总结一个数组。在这里你可以看到结果:

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

如您所见,通过引用传递数组有时会使其在其他情况下速度变慢。 A 真的不知道这背后的原因是什么。

这是我用于测试的代码:

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";

【问题讨论】:

    标签: php arrays reference parameter-passing


    【解决方案1】:
    • 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 - 由于函数的参数是通过引用传递的,因此每次访问参数都会有一个重定向,并且需要时间;

    【讨论】:

      猜你喜欢
      • 2015-10-02
      • 2014-11-12
      • 1970-01-01
      • 2013-07-18
      • 2011-04-13
      • 2015-11-20
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多