PHP速度:哪个更快?if (isset($foo))还是if ($foo==true)?

11
我只是想优化我的代码。 我需要用来自数据库的数据填充表单,并且需要检查变量是否存在以填充文本框(我不喜欢@错误隐藏)。 表单非常长,所以我需要多次检查变量是否存在。
以下两者哪个更快?
  • if (isset($item))
  • if ($item_exists == true)
甚至可以使用以下代码:
  • if ($item_exists === true)

3
如果你使用 if ($foo==true),可能会遇到麻烦。如果 $foo 的值为零且这是有效的呢? - KM.
"==和==="的性能惩罚是由于变量不存在而抛出一个E_NOTICE错误。抛出错误比较昂贵。当您调用isset()时,如果变量不存在,就不会抛出错误。" - Frank Farmer
6个回答

32

使用 for 循环重复执行10000000次相同的脚本,以下是该脚本所需的时间:

  • if (isset ($item)) 2.25843787193
  • if ($item_exists==true) 6.25483512878
  • if ($item_exists===true) 5.99481105804

因此我可以确定 isset 明显更快。


1
+1 用于进行基准测试。它还表明这并没有真正的区别 - PHP脚本很少会执行1000万次某个操作,通常数据库/文件I/O开销即使在这种情况下也会大大增加所需的时间。 - Pekka
$item_exists是什么?我认为"=="可能会根据它的类型而有所不同。 - Seaux
2
为了增加数字游戏的乐趣:无论哪种方式,时间都在0.0000001秒的数量级上。这意味着你需要在每个页面上执行大约1,000,000次才能让用户注意到(假设用户会注意到0.1秒)。简而言之,这种微小的优化很少会有任何影响。 - Jim L
2
这是一个与性能相关的可怕问题和可怕的答案,这些琐碎的事情与优化毫无关系,只有Pekka的答案有意义。 - Your Common Sense

11

在这种情况下,您不应该首先问关于性能,而是要问关于正确性。因为 isset 的行为不像布尔转换和与 true 的比较(请参见类型比较表)。特别是值为""(空字符串),array()(空数组),false0"0"(作为字符串的0)都会被处理得不同。


1
除了比较表的差异外,对未声明变量使用比较运算符会导致 E_NOTICE 错误。 - Frank Farmer

7

我确信在性能方面会有差异;我相信已经有地方对此进行了基准测试;但我也确定,对于实际应用来说,这真的不重要。任何可达到的性能提升都只是毫秒级别的,而更加重要的是代码的可读性以及避免警告(无论输出与否,都会影响性能)。

如果您不能确定在访问时是否设置了变量,则可能需要使用isset。如果$item_exists始终为布尔值,则不需要类型安全比较===,但也不会有害。因此,根据您的情况,您可能需要使用:

if ((isset($item)) and ($item_exists === true))

最好使用 if(empty($item)) 而不是那段代码。 - Ariel

1

回答问题,最可能的是isset()和"==="会更快,因为它们只检查一个条件,而==则检查多个条件并且较慢。我没有正式测试过,但我认为这是正确的。@Pekka也是正确的,如果你想要优化,这些不是你应该优化的地方。因为可能需要成千上万次的调用才能注意到几毫秒的差异。


-1
我建议以下几个替代方案:
if (@$item)
if (@$item_exists)

-2

优化代码只有一种方法,称为“剖析”。首先,您必须知道需要进行优化的代码部分。然后才能运行测试,找到解决方案等。

Marcx答案中的“循环”方法也很糟糕。如果要测试任何代码是否产生真正的差异,请从浏览器的角度使用Apache基准测试工具进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接