当前位置: 首页 > 面试题库 >

unset和= null之间的区别

邵伟
2023-03-14
问题内容

从随机的php.net帖子中:

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

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

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

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

Techno Mumbo巨无霸无法解决。


问题答案:

两种方法之间的重要区别是,它们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字节的差异,但是仍然存在差异。



 类似资料:
  • 问题内容: 嗨,我想知道上述比较之间的区别吗? 我在检查时得到空指针异常。但是,如果我将其更改为,则效果很好。 问题答案: 和之间的区别 没有语义上的差异。 和 等价。 也许您将其与以下事实混淆了: 和 可以有所作为(因为第二种选择可能会导致NPE(如果被叫人为空)。

  • 问题内容: 我必须检查特定列的值是否为空。 当我使用进行检查时,查询失败,但是当我进行了检查时,查询成功了。 两者之间有什么区别。 请解释。 问题答案: 是缺少值。空字符串是一个值,但只是空的。对数据库来说是特殊的。 已经没有界限,它可以用于,,等字段在数据库中。 没有分配任何内存,with值只是一个指向内存中无处的指针。但是,尽管存储在内存中的值为,但是将空IS分配给了内存位置。

  • 问题内容: 据我了解,当JSF操作返回(空字符串)时,用户停留在当前页面上,但视图已刷新。但是,当操作返回时,用户仍停留在当前页面上,但旧视图已被重用。我的问题是: 上面的陈述正确(准确)吗? 如果是,那么这意味着什么?具体来说,使用一种对另一种对页面上的数据(例如,JSF UI组件中的值或存储在DataTable中的请求范围Bean中的数据)有什么影响? 在什么情况下应该使用一种而不是另一种?

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

  • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。