总结一下,我做了几次迭代的循环来检查每个测试的效率:
$iterations = 99999999;
$var = null;
isset comparasion
if ( isset( $var ) )
{
}
'==='比较
if ( $var === null )
{
}
我有这个日志,以微秒为单位:
'isset()': 1.4792940616608
'===': 1.9428749084473
对我来说,这有点好奇。为什么isset()
函数比一个比较运算符更快===
?
答案 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名称)
这是一个有趣的问题,出于好奇心的缘故,但我们处于分散的领域,这可能不是真实的优化策略。