Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么isset()比';测试更有效===';?_Php - Fatal编程技术网

Php 为什么isset()比';测试更有效===';?

Php 为什么isset()比';测试更有效===';?,php,Php,总之,我做了一个循环,进行了几次迭代,以检查每个测试的效率: $iterations = 99999999; $var = null; isset比较 if ( isset( $var ) ) { } if ( $var === null ) { } “==”比较 if ( isset( $var ) ) { } if ( $var === null ) { } 我有这个日志,以微秒为单位: 'isset()': 1.479294

总之,我做了一个循环,进行了几次迭代,以检查每个测试的效率:

$iterations = 99999999;
$var = null;
isset比较

  if ( isset( $var ) )
  {

  }
  if ( $var === null )
  {

  }
“==”比较

  if ( isset( $var ) )
  {

  }
  if ( $var === null )
  {

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

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

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

比较是一项严格的检查,这意味着你要比较的两个对象必须是同一类型的。当你用通俗易懂的英语把它分解时,
==
需要更多的时间其实并不奇怪。考虑解析器这样做:

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!
}

如您所见,
=
操作符需要进行额外的检查,然后才能确定变量是否与条件匹配,因此速度稍慢一点并不奇怪。

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

另一件事是isset到处都在使用,所以它被描述成死亡是有道理的,而===可能没有得到那么多的爱


除此之外,您还必须使用探查器挖掘PHP源代码,以查看到底发生了什么

我不确定我会称1亿为“几次迭代”。如果我的数学是正确的,你似乎已经积累了大约半秒的差异,除以1亿,你每次迭代都会得到5纳秒的巨大差异。由于差异如此之小,可能简单地归结为这样一个事实:
isset
在此上下文中只有一个操作数,
=
有两个操作数

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

isset
本身在虚拟机中由三种不同的操作码覆盖,具体取决于上下文:

“简单”编译变量,如您的示例:

数组:(需要两个操作数,变量和索引)

对象属性:(还有2个操作数、变量和属性名)


出于好奇,这是一个有趣的问题,但我们正处于一个令人毛骨悚然的领域,它可能不是一个现实世界的优化策略。

Isset
不是一个函数:它是一种内置语言。使用
isset
比使用函数更快。另一件事是,
isset
到处都在使用,所以它被剖析到死亡是有意义的,而
==
可能没有收到那么多的爱。有趣的是,“isset”用于检查变量是否存在,是否不为空,而“===”运算符用于检查两个值是否相同。您可能会认为“isset”会慢几毫秒,因为检查了两件事,其中as“==”只检查一件事。
isset()
只是检查变量是否设置了。而
==
比较值。这就是为什么isset比
===
更有效的原因;我认为两者是不同的东西。我们在同一个函数中使用这两个变量。可能这和===检查变量是否相同有关type@PrashantTapaseisset()检查变量是否也不是null
isset
还执行与
null
的比较。你的解释有点不科学。我给这个+1是因为它确实提出了正确的观点,尽管我也同意@zerkms的观点。同样值得向OP指出的是,虽然一个操作可能比下一个操作快,但这两个操作都不算慢;谨防过度分析这类内容并进行微观优化的诱惑,因为它很少对代码的性能产生重大影响。如果你想优化你的代码,首先要找出真正的瓶颈在哪里,然后把你的精力放在优化这些方面。@zerkms-True,我不是说这是一个科学证据。这只是一个例子,说明在得出最终结论之前,
==
需要做一些额外的步骤。@Oldskool问题在于,不仅“步骤”的数量很重要,而且它们的复杂性也很重要。一般来说,“2个操作比1个操作快”的说法是不真实的。根据上下文,其他事情也可能发生变化。检查
if($var=='foo')
可能比示例快一点点,因为引擎盖下的实现可以在看到两个操作数不是同一类型时提前退出
false