正如我在其他所有文章中所读到的那样,对函数的按引用传递比按值传递(利用写时复制)传递性能差得多。当通过闭包中的“ use”运算符传递变量时,这是否也适用?
例如:
$message = 'hello';
$greetings = function () use (&$message) {
echo $message;
};
$huge_number = 100000000;
while ($huge_number > 0) {
$greetings();
$huge_number--;
}
这还会引起与按引用传递变量相关的开销吗?如果是这样,这是否意味着每次调用该函数时,PHP都会在内部“重新捕获”本地作用域?
答案 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));
但是您可能必须循环执行一次,以使其花费足够的时间进行测量。即便如此,它很大程度上仍取决于您要传递的数据。