在PHP内部,通过闭包传递“ use”运算符的引用是否会提供较差的性能?

时间:2018-10-15 16:39:33

标签: php performance closures

正如我在其他所有文章中所读到的那样,对函数的按引用传递比按值传递(利用写时复制)传递性能差得多。当通过闭包中的“ use”运算符传递变量时,这是否也适用?

例如:

$message = 'hello';

$greetings = function () use (&$message) {
    echo $message;
};

$huge_number = 100000000;

while ($huge_number > 0) {
    $greetings();
    $huge_number--;
}

这还会引起与按引用传递变量相关的开销吗?如果是这样,这是否意味着每次调用该函数时,PHP都会在内部“重新捕获”本地作用域?

1 个答案:

答案 0 :(得分:2)

这实际上不是答案,而是一种解释:

  

通过函数传递引用比通过值传递提供更差的性能

也许是这样,但这并不是通过引用传递的真正目的。目的是在不返回数据或不复制数据的情况下更新原始文件。

所以要测试一下

$greetings = function () use (&$message) {
   echo $message;
};

VS

$greetings = function () use ($message) {
     echo $message;
};

这不是很公平,因为第一个是在做事情,第二个是在做事情。并且没有在此处使用“按引用传递”的目的(或目的)。

一个公平的测试是这样的:

$message = "foo";

$greetings = function () use (&$message) {
   $message .= " bar";
};

$greetings();
//$message = "foo bar";

VS

$message = "foo";

$greetings = function() use ($message){
    return $message . " bar";
};

$message = $greetings();
//$message = "foo bar";

因此,仅在调用它而不测试如何影响数据的情况下进行测试就不会公平。换句话说,第一对示例传递参考可能更慢。但是在第二对中仍然如此,内存使用情况如何?

在任何情况下,您都可以像这样对它们计时:

$start = microtime(true);
//...some code to test
echo format_number((microtime(true) - $start), 2));

但是您可能必须循环执行一次,以使其花费足够的时间进行测量。即便如此,它很大程度上仍取决于您要传递的数据。