为什么在PHP中,使用“===”比“==”运算符更快?

174

=== 为什么在 PHP 中比 == 更快?


40
它更快了,但是它是否显著更快呢? - Piskvor left the building
21
请不要阅读有关 PHP 哪个更快的内容,而是了解如何在单个 SQL 查询中获取有趣的数据,而不滥用 JOIN 操作。 - Kamil Szot
15
有关于在 JavaScript 中使用 ===== 运算符的区别,对同一主题感兴趣的人可以在这里阅读:https://dev59.com/Z3RC5IYBdhLWcg3wROpQ - Marco Demaio
5
@Piskvor,那不是问题的问题。 - Pacerier
6
@Pacerier:公道的观点——这就是为什么我只进行评论。它并没有回答问题,但提供了对问题的看法。 - Piskvor left the building
显示剩余2条评论
12个回答

210

因为等值运算符==会强制转换数据类型,暂时判断是否等于另一个操作数,而===(恒等运算符)根本不需要进行任何转换,因此处理更快。


我认为你的观点与PHP手册所说的相反。他们说如果$a等于$b,$a == $b是TRUE,而如果$a等于$b并且它们是相同类型,$a === $b是TRUE。 - Bakhtiyor
2
我相信实际情况是对于复杂类型,两个操作数指向同一片内存区域,但meder的答案涵盖了这一点。 - Basic
1
这在JS中是有意义的,但如果有人添加一些真正简单的性能测试参考,那就更好了。 - Marco Demaio
5
在“控制结构”部分,http://www.phpbench.com/显示了使用“==”和“===”之间性能差异的指示。 - awhie29urh2
那么,仅使用 if(value) 与使用 if(value===true)if(value==true) 有什么区别吗? - Muhammad Omer Aslam
if(value) 中,value 直接转换为布尔值 然后进行评估,而严格比较 (===) 则是 执行比较以获取布尔值,然后再进行评估。在大多数情况下,比较可能需要更长的时间。但任何性能优势都应该微不足道,我们最好将时间花费在更有效地解决问题或使代码更易读上。@MuhammadOmerAslam - JPR

57

===不执行类型转换,因此0 == '0'的结果为true,但0 === '0'则为false


27

需要考虑两件事:

  1. 如果操作数类型不同,则=====会产生不同的结果。在这种情况下,运算符的速度并不重要,重要的是哪个运算符产生所需的结果。

  2. 如果操作数类型相同,则可以使用=====,因为两者都会产生相同的结果。在这种情况下,两个运算符的速度几乎相同。这是因为两个运算符都不执行任何类型转换。

我比较了以下代码的速度:

  • $a == $b vs $a === $b
  • 其中$a$b是[1, 100]之间的随机整数
  • 将生成并比较一百万次这两个变量
  • 测试运行了10次

以下是测试结果:

 $a == $b $a === $b
--------- ---------
 0.765770  0.762020
 0.753041  0.825965
 0.770631  0.783696
 0.787824  0.781129
 0.757506  0.796142
 0.773537  0.796734
 0.768171  0.767894
 0.747850  0.777244
 0.836462  0.826406
 0.759361  0.773971
--------- ---------
 0.772015  0.789120
你可以看到速度几乎相同。

15
我在想,如果你在一台除了输出平均值以外什么也不做的机器上进行数十亿次迭代,会发生什么。看起来这里有很多噪声。;) - Gung Foo
4
我得出了同样的结论:如果已知操作数属于相同类型,则无法测量差异。其他情况没有意义。几乎所有其他答案都是错误的。 - Paul Spiegel
1
我相信这应该是被选中的答案。它不仅仅是基于假设的理性化,这些假设在很大程度上是经过实证测试的。 - Pedro Amaral Couto
@Marco,当我说“经验研究”时,我的意思是它基于实践,例如:运行代码而不仅仅是使用理性(或你的想法)进行论证,没有实验证明支持。Salman A的价值建议===有时会更快,有时会稍微慢一些。这意味着“为什么在PHP中===比==更快?”存在一个问题:“你怎么知道===比==更快?”编译器优化只是一个解释,不是什么更快或更慢的东西,我也没有说应该使用什么。 - Pedro Amaral Couto
@PedroAmaralCouto 给出的答案是10个例子,这并不能排除很多外部因素,Salman也没有展示这些例子是如何产生的。我仍然相信编译器会尽可能地优化它们,以避免类型转换,例如首先使用内存中的类型进行快速类型比较,如果你增加了大量的比较次数(而不是数字本身),以至于之前的结果无法存储在CPU缓存中,你会得到什么结果?或者如果你使用了BigInt/对象等自定义变量类型,可能会“欺骗”编译器。 - Marco
显示剩余4条评论

26

首先,=== 检查两个参数是否为相同的类型 - 因此数字 1 和字符串 '1' 在进行任何比较之前均未通过类型检查而失败。另一方面,== 不会首先检查类型,而是继续将两个参数转换为相同的类型,然后执行比较。

因此,=== 更快地检查失败条件。


10
我猜测 == 运算符首先检查类型,以确定是否需要进行任何类型转换。而 === 运算符不执行任何转换操作,这就是它更快的原因。 - deceze

7

我不确定它是否显著更快,但在大多数语言中,===是直接类型比较,而==将尝试进行类型强制转换以获得匹配。


9
JavaScript 有 === 运算符。 - Frank Shearar
我相信你可以在Common Lisp和Scheme中做到“===”。 - pupeno
JavaScript - 我查过的三种语言定义中都没有;而Lisp和Scheme是很多东西,但几乎不常见。 - TomTom
1
Ruby有===。我已经太久没有记得它是否做同样的事情了。 - KitsuneYMG
1
另外,对于ActionScript,请参考http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/operators.html。基本上,搜索“严格相等”。 - Chris

5

使用 == 进行比较时,需要进行类型转换,因此效率较低。而使用 === 先检查类型,无需进行类型转换,因此效率更高。


4
因为在比较之前,===不需要强制操作数的类型相同。我怀疑速度上的差异并不是很大。在正常情况下,您应该使用更有意义的运算符。

3

总结而言,=== 更快,因为它不会将数据类型转换以查看两个变量是否具有相同的值,但是当您需要查看两个变量是否具有相同的值时,如果不关心变量的类型,则可以使用 == ,如果变量的类型也很重要,则应使用 ===。


3
我发现这两个操作符之间实际上存在着显著的速度差异。以下是在docker容器中运行php 8.0.0 RC5和php 7.4.12所得到的结果。该项目托管在github上,每个人都可以审查方法论。免责声明:我建立了这个工具。
$ php src/benchmark.php --custom --filter ~equal~
PHP benchmark

-------------------------------
platform           :  Linux x64
php version        :     7.4.12
xdebug             :        off
memory limit       :       128M
max execution      :          0
time per iteration :       50ms
iterations         :        100
-------------------------------
---------------------------------------------------
0                  :         ==       ===
mean               :     394156    459015    +16.5%
median             :     397448    461822    +16.2%
mode               :     398154    458062    +15.0%
minimum            :     313271    405692    +29.5%
maximum            :     411157    480360    +16.8%
quartile 1         :     393222    454952    +15.7%
quartile 3         :     400881    466491    +16.4%
IQ range           :       7659     11538    +50.7%
std deviation      :      15593     11867    -23.9%
normality          :       0.8%      0.8%
---------------------------------------------------

$ php src/benchmark.php --custom --filter ~equal~
PHP benchmark

-------------------------------
platform           :  Linux x64
php version        :   8.0.0RC5
xdebug             :        off
memory limit       :       128M
max execution      :          0
time per iteration :       50ms
iterations         :        100
-------------------------------
---------------------------------------------------
0                  :         ==       ===
mean               :     405032    474768    +17.2%
median             :     409226    477313    +16.6%
mode               :     408421    479741    +17.5%
minimum            :     311606    386509    +24.0%
maximum            :     417895    491842    +17.7%
quartile 1         :     405740    473436    +16.7%
quartile 3         :     412677    483139    +17.1%
IQ range           :       6937      9703    +39.9%
std deviation      :      17501     15657    -10.5%
normality          :       1.0%      1.0%
---------------------------------------------------

0

更快不应该仅仅以直接执行时间来衡量(在这种情况下,直接性能测试几乎可以忽略不计)。话虽如此,我需要看到一个涉及迭代或递归的测试,才能真正看出是否存在显著的累积差异(当在实际环境中使用时)。处理边缘情况时节省的测试和调试时间对您也应该有意义。


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