为什么===
比==
PHP 更快?
12 回答
因为相等运算符==
暂时强制或转换数据类型以查看它是否等于另一个操作数,而===
(标识运算符)不需要进行任何转换,因此完成的工作更少,这使得它更快。
===
不执行类型转换,因此0 == '0'
计算结果为true
,但0 === '0'
- 到false
。
有两点需要考虑:
如果操作数类型不同
==
,则会===
产生不同的结果。在这种情况下,操作员的速度无关紧要;重要的是哪一个产生了预期的结果。如果操作数类型相同,则可以使用其中之一
==
或===
两者都将产生相同的结果。在这种情况下,两个操作员的速度几乎相同。这是因为两个运算符都不执行类型转换。
我比较了以下速度:
$a == $b
对比$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
您可以看到速度几乎相同。
首先, === 检查两个参数是否是相同的类型——所以在实际执行任何比较之前,数字 1 和字符串 '1' 在类型检查中失败。另一方面, == 不首先检查类型,而是继续将两个参数转换为相同的类型,然后进行比较。
因此, === 更快地检查失败条件
我真的不知道它是否明显更快,但是 === 在大多数语言中是直接类型比较,而 == 会在必要/可能获得匹配时尝试进行类型强制。
因为在比较它们之前===
不需要强制操作数是相同的类型。
我怀疑速度差异很大。在正常情况下,您应该使用更有意义的运算符。
== 在比较之前会产生更大的类型转换开销。=== 首先检查类型,然后继续进行,无需进行任何类型转换。
总之 === 更快,因为不要转换数据类型来查看两个变量是否具有相同的值,但是当您需要查看两个变量是否具有相同的值时,您将使用 == if does not mather what type are variables , 或 === if 变量的类型也很重要。
我发现这两个操作员之间实际上存在显着的速度差异。php 8.0.0 RC5 和 php 7.4.12 在下面的 docker 容器中运行的结果。该项目托管在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%
---------------------------------------------------
更快不应仅以直接执行时间来衡量(在这种情况下,直接性能测试几乎可以忽略不计)。也就是说,我需要查看一个涉及迭代或递归的测试,以真正了解是否存在显着的累积差异(在现实环境中使用时)。处理边缘情况时节省的测试和调试时间对你来说也应该是有意义的
在 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_)
如果测试结果正确,那么一定是编译器问题,
处理器将在一个时钟周期内执行它被告知要执行的任何操作
如果它有更少的事情,那么它会更快地做
添加:
嗯,实际上如果编译器已经创建了大量要处理的机器代码,那么如果它已经添加了无数的东西来处理需要比较什么类型的数据,那么删除一个“次要”IF 不会对速度产生太大影响一点也不。
如果有人还在读这篇文章,那么我对更多的讨论很感兴趣。
菲尔