为什么isset()比'==='更有效率?

时间:2015-08-13 05:53:55

标签: php

总结一下,我做了几次迭代的循环来检查每个测试的效率:

$iterations = 99999999;
$var = null;

isset comparasion

  if ( isset( $var ) )
  {

  }

'==='比较

  if ( $var === null )
  {

  }

我有这个日志,以微秒为单位:

'isset()': 1.4792940616608
'===': 1.9428749084473

对我来说,这有点好奇。为什么isset()函数比一个比较运算符更快===

3 个答案:

答案 0 :(得分:4)

===比较是严格检查,这意味着您要比较的两个对象必须属于同一类型。当你用简单的英语分解它时,===需要更多的时间实际上并不奇怪。考虑解析器执行此操作:

if (isset($var)) {
    // Do I have something called $var stored in memory?
    // Why yes, I do.. good, return true!
}

if ($var === null) {
    // Do I have something called $var stored in memory?
    // Why yes, I do.. good! But is it a NULL type?
    // Yes, it is! Good, return true!
}

正如您所看到的,===运算符需要先进行额外的检查,然后才能确定变量是否与条件匹配,所以它稍微慢一些并不奇怪。

答案 1 :(得分:1)

Isset不是一个函数:它是一种内置语言。使用isset比使用函数更快。

另一件事是isset在整个地方被使用,所以它被判断为死亡是有道理的,而===也许并没有得到那么多的爱。

除此之外,您必须使用分析器挖掘PHP源代码以确切了解正在发生的事情。

答案 2 :(得分:0)

我不确定我会拨打1亿次“几次迭代”。你似乎累积了大约半秒的差异,将其除以1亿,如果我的数学是正确的,你每次迭代会得到高达5纳秒的差异。由于差异很小,可能只是归结为isset在此上下文中只有一个操作数而===有两个操作数。

在没有指定特定PHP版本的情况下,甚至不可能讨论两个示例的Zend引擎的实现细节;源代码是一个移动目标。即使对实现进行微小的更改也会影响多次传递的结果。如果您发现某些版本的PHP和/或在不同的上下文中情况相反,我不会感到惊讶。

isset本身由VM中的三个不同操作码覆盖,具体取决于上下文:

“简单”编译变量,例如:ZEND_ISSET_ISEMPTY_VAR

数组:ZEND_ISSET_ISEMPTY_DIM_OBJ(需要2个操作数,var和索引)

对象属性:ZEND_ISSET_ISEMPTY_PROP_OBJ(也是2个操作数,var和prop名称)

这是一个有趣的问题,出于好奇心的缘故,但我们处于分散的领域,这可能不是真实的优化策略。