为什么===
比PHP中的==
更快?
答案 0 :(得分:191)
因为等于运算符==
强制转换,或临时转换数据类型以查看它是否等于另一个操作数,而===
(标识运算符)不需要进行任何转换,因此减少工作量,使其更快。
答案 1 :(得分:53)
===
不执行类型转换,因此0 == '0'
评估为true
,0 === '0'
评估为false
。
答案 2 :(得分:25)
首先,===检查两个参数是否相同类型 - 因此在进行任何比较之前,数字1和字符串“1”在类型检查上失败。另一方面,==不会先检查类型,然后继续将两个参数转换为相同的类型然后进行比较。
因此,===更快地检查失败条件
答案 3 :(得分:21)
有两件事需要考虑:
如果操作数类型不同,则==
和===
会产生不同的结果。在这种情况下,操作员的速度无关紧要;重要的是哪一个产生了预期的结果。
如果操作数类型相同,则可以使用==
或===
,因为两者都会产生相同的结果。在这种情况下,两个运营商的速度几乎相同。这是因为任何一个运营商都没有进行类型转换。
我比较了以下的速度:
$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
你可以看到速度几乎相同。
答案 4 :(得分:7)
我真的不知道它是否明显更快,但在大多数语言中===是直接类型比较,而==将尝试在必要时进行类型强制/可能获得匹配。
答案 5 :(得分:4)
在比较之前===
doesn't need to coerce the operands to be of the same type。
我怀疑速度的差异非常大。在正常情况下,你应该使用任何更有意义的操作符。
答案 6 :(得分:4)
在比较之前,==会产生更大的类型转换开销。 ===首先检查类型,然后继续而不必进行任何类型转换。
答案 7 :(得分:2)
总之,===更快,因为不转换数据类型以查看两个变量是否具有相同的值,但是当您需要查看两个变量是否具有相同的值时,您将使用==如果不知道什么是什么type是变量,或者=== if变量的类型也很重要。
答案 8 :(得分:0)
更快不应仅在直接执行时进行测量(在这种情况下,直接性能测试几乎可以忽略不计)。就是说,我需要查看一个涉及迭代或递归的测试,以真正查看是否存在显着的累积差异(在实际环境中使用时)。在处理极端情况时,您节省的测试和调试时间对您来说也应该有意义
答案 9 :(得分:0)
在php(c代码)中,值是一个“类”,例如:
class value
{
$int_;
$float_;
$string_;
$array_;
$object_;
}
当您比较$a == $b
和$a
是int
类型时,将出现以下内容:
if ($a->int_ == $b->int_ || $a->int_ == (int) $b->float_ || $a->int_ == (int) $b->string_ || ...)
但是string
'1'
不会转换为ASCII代码49
,而是1
。
当您比较$a === $b
并且$a
是int
类型时,会出现类似以下内容:
if ($a->int_ == $b->int_)
答案 10 :(得分:0)
我发现这两个操作员之间实际上存在明显的速度差异。在以下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%
---------------------------------------------------
答案 11 :(得分:-3)
如果测试结果正确,则必须是编译器问题,
处理器将执行在时钟周期中所做的任何事情
如果没有那么做,那么做起来会更快
增加:
实际上,如果编译器已经创建了大量要处理的机器代码,那么如果它已经添加了数以万计的东西来应对需要比较的数据类型,那么删除一个" minor&# 34; IF根本不会改变速度。
如果还有人读到这篇文章,那么我会在更多的讨论中感兴趣。
菲尔