unset vs. = NULL

7 php

可能重复:
使用PHP释放内存有什么好处:unset()或$ var = null

这个问题是对使用PHP释放内存有什么好处的后续问题:unset()或$ var = null

长话短说,我自己的基准似乎与该问题中给出的答案相矛盾.我的问题是......为什么?答案是错的还是有些东西我只是不理解?

<?php
$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    $a = 'a';
    $a = NULL;
}
$elapsed = microtime(true) - $start;

echo "took $elapsed seconds\r\n";



$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    $a = 'a';
    unset($a);
}
$elapsed = microtime(true) - $start;

echo "took $elapsed seconds\r\n";
?>
Run Code Online (Sandbox Code Playgroud)

看来,"= null"似乎更快.

PHP 5.4结果:

  • 花了0.88389301300049秒
  • 花了2.1757180690765秒

PHP 5.3结果:

  • 花了1.7235369682312秒
  • 花了2.9490959644318秒

PHP 5.2结果:

  • 花了3.0069220066071秒
  • 花了4.7002630233765秒

PHP 5.1结果:

  • 花了2.6272349357605秒
  • 花了5.0403649806976秒

PHP 5.0和4.4开始有所不同.

5.0:

  • 花了10.038941144943秒
  • 花了7.0874409675598秒

4.4:

  • 花了7.5352551937103秒
  • 花了6.6245851516724秒

请记住microtime(true)在PHP 4.4中不起作用所以我不得不使用php.net/microtime/Example#1中给出的microtime_float示例.

Mar*_*eed 2

仔细阅读所选答案:

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

所以,如果你所做的只是记忆,是的,那会更快。但在实际的应用程序中,您可能会发现它会减慢速度。

  • 老实说,这对我来说没有任何意义。我的意思是,什么, unset 神奇地不执行任何汇编指令,而 $whatever = null; 做?给出的答案与“$whatever = null 重置缓冲区和 L1 缓存,而 unset 清除缓冲区并重置 L2 缓存”一样有用。技术上的胡言乱语并不构成答案。 (7认同)
  • @ansur我把马克的答案理解为:如果你一遍又一遍地重用同一个指针(为变量分配内存)并且仅此而已,那么“$var = null”会更快。我假设这是因为“unset()”在将内存作业交给垃圾收集器而不是显式清除它时(使用“$var = null”)有一些隐式开销。`unset()` 的优势在于,如果您正在编写不会一遍又一遍地重用同一变量的“真实代码”,并且您只是想告诉 PHP“嘿,我不需要 `$ var` 不再存在。当它有意义时删除它。” (2认同)