一尘不染

unset和= null之间的区别

php

从随机的php.net帖子中:

如果您正在执行$ whatever = null;
那么您正在重写变量的数据。您可能会更快地释放/缩小内存,但可能会从真正需要它们的代码中窃取CPU周期,从而导致更长的总体执行时间。

显然,这是无可争辩的真理,所以也许有人会乐于解释。

我的意思是,什么unset神奇地不会执行任何汇编指令,而会$whatever = null;执行?给出的答案和说出来的一样有用

$ whatever = null会重置缓冲区和L1缓存,而unset会清除缓冲区并重置L2缓存。

Techno Mumbo巨无霸无法解决。


阅读 309

收藏
2020-05-29

共1个答案

一尘不染

两种方法之间的重要区别是,它们unset($a)$a从符号表中删除。例如:

$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);

输出:

Notice: Undefined variable: a in xxx
NULL

但是何时$a = null使用:

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);

输出:

NULL

我也通过基准测试运行了代码,发现它$a = nullunset()同等程序快大约6%。似乎更新符号表条目比删除它更快。

附录

另一个区别(如该小脚本所示)似乎是每次调用后恢复多少内存:

echo memory_get_usage(), PHP_EOL;
$a = str_repeat('hello world ', 100);
echo memory_get_usage(), PHP_EOL;
// EITHER unset($a); OR $a = null;
echo memory_get_usage(), PHP_EOL;

在使用时,unset()除64个字节的内存外,其他$a = null;所有内存均被返还,而272个字节的内存则全部释放。我没有足够的知识来知道为什么两种方法之间都存在208字节的差异,但是仍然存在差异。

2020-05-29