unset和= null之间的区别

从一个随机的php.net文章 :

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

显然这是无可争辩的事实,所以也许有人会这样解释。

我的意思是,不会奇迹般地执行任何汇编指令,而$whatever = null; 呢? 正如所给出的答案,与其说是一样有用

$ whatever = null重置缓冲区和L1caching,而未设置则清除缓冲区并重置L2caching。

技术人员并不构成答案。

这两种方法之间的一个重要区别是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 

我通过一个基准testing了代码,发现$a = null大约比unset()对应的要快6%。 看起来,更新符号表条目比删除它更快。

附录

另一个区别(如在这个小脚本中看到的)似乎是每次调用后恢复多less内存:

 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字节的差异,但这仍然是一个区别。

使用未设置时,内存使用率和处理时间较less。

http://php.net/manual/en/function.unset.php#105980

我做了一个简单的testing。

考虑到这样一个简单的类:

 class Cat{ public $eyes = 2; public $claws = 4; public $name = "Kitty"; public $sound = ['Meow', 'Miaou']; } 

我运行这个代码

 $start = microtime(true); for($i = 10000000; $i > 0; --$i){ $cat = new Cat; $cat = null; } $end = microtime(true); printf("Run in %s and use %s memory", round($end - $start, 2), round(memory_get_usage() / 1000, 2)); 

在1.95运行并使用233.29内存

和这个

 for($i = 10000000; $i > 0; --$i){ $cat = new Cat; unset($cat); } 

在2.28中运行并使用233.1内存

对于什么是值得的, null方法运行得更快。

使用代码

 $a = str_repeat('hello world ', 10000); $start1 = microtime(true); unset($a); $stop1 = microtime(true); $a = str_repeat('hello world ', 10000); $start2 = microtime(true); $a = null; $stop2 = microtime(true); echo 'unset time lap of '. ( $stop1 - $start1 ) .'<br>'; echo 'null time lap of '. ( $stop2 - $start2 ) .'<br>'; 

10次​​:

 unset time lap of 5.0067901611328E-6 null time lap of 1.1920928955078E-6 unset time lap of 9.5367431640625E-7 null time lap of 9.5367431640625E-7 unset time lap of 0 null time lap of 9.5367431640625E-7 unset time lap of 2.1457672119141E-6 null time lap of 1.1920928955078E-6 unset time lap of 2.1457672119141E-6 null time lap of 0 unset time lap of 9.5367431640625E-7 null time lap of 0 unset time lap of 1.9073486328125E-6 null time lap of 9.5367431640625E-7 unset time lap of 9.5367431640625E-7 null time lap of 0 unset time lap of 1.9073486328125E-6 null time lap of 9.5367431640625E-7 unset time lap of 0 null time lap of 0 

看起来像空分配有更less的处理时间更经常。