===
为什么在 PHP 中比 ==
更快?
===
为什么在 PHP 中比 ==
更快?
因为等值运算符==
会强制转换数据类型,暂时判断是否等于另一个操作数,而===
(恒等运算符)根本不需要进行任何转换,因此处理更快。
if(value)
与使用 if(value===true)
或 if(value==true)
有什么区别吗? - Muhammad Omer Aslamif(value)
中,value
直接转换为布尔值 然后进行评估,而严格比较 (===
) 则是 执行比较以获取布尔值,然后再进行评估。在大多数情况下,比较可能需要更长的时间。但任何性能优势都应该微不足道,我们最好将时间花费在更有效地解决问题或使代码更易读上。@MuhammadOmerAslam - JPR===
不执行类型转换,因此0 == '0'
的结果为true
,但0 === '0'
则为false
。
需要考虑两件事:
如果操作数类型不同,则==
和===
会产生不同的结果。在这种情况下,运算符的速度并不重要,重要的是哪个运算符产生所需的结果。
如果操作数类型相同,则可以使用==
或===
,因为两者都会产生相同的结果。在这种情况下,两个运算符的速度几乎相同。这是因为两个运算符都不执行任何类型转换。
我比较了以下代码的速度:
$a == $b
vs $a === $b
$a
和$b
是[1, 100]之间的随机整数以下是测试结果:
$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
你可以看到速度几乎相同。首先,=== 检查两个参数是否为相同的类型 - 因此数字 1 和字符串 '1' 在进行任何比较之前均未通过类型检查而失败。另一方面,== 不会首先检查类型,而是继续将两个参数转换为相同的类型,然后执行比较。
因此,=== 更快地检查失败条件。
==
运算符首先检查类型,以确定是否需要进行任何类型转换。而 ===
运算符不执行任何转换操作,这就是它更快的原因。 - deceze我不确定它是否显著更快,但在大多数语言中,===是直接类型比较,而==将尝试进行类型强制转换以获得匹配。
使用 == 进行比较时,需要进行类型转换,因此效率较低。而使用 === 先检查类型,无需进行类型转换,因此效率更高。
===
不需要强制操作数的类型相同。我怀疑速度上的差异并不是很大。在正常情况下,您应该使用更有意义的运算符。总结而言,=== 更快,因为它不会将数据类型转换以查看两个变量是否具有相同的值,但是当您需要查看两个变量是否具有相同的值时,如果不关心变量的类型,则可以使用 == ,如果变量的类型也很重要,则应使用 ===。
$ 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%
---------------------------------------------------
更快不应该仅仅以直接执行时间来衡量(在这种情况下,直接性能测试几乎可以忽略不计)。话虽如此,我需要看到一个涉及迭代或递归的测试,才能真正看出是否存在显著的累积差异(当在实际环境中使用时)。处理边缘情况时节省的测试和调试时间对您也应该有意义。
===
和==
运算符的区别,对同一主题感兴趣的人可以在这里阅读:https://dev59.com/Z3RC5IYBdhLWcg3wROpQ - Marco Demaio