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。
我做了一个简单的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的处理时间更经常。