172

为什么=====PHP 更快?

4

12 回答 12

209

因为相等运算符==暂时强制或转换数据类型以查看它是否等于另一个操作数,而===(标识运算符)不需要进行任何转换,因此完成的工作更少,这使得它更快。

于 2010-03-08T13:16:14.013 回答
55

===不执行类型转换,因此0 == '0'计算结果为true,但0 === '0'- 到false

于 2010-03-08T13:17:38.400 回答
26

有两点需要考虑:

  1. 如果操作数类型不同==,则会===产生不同的结果。在这种情况下,操作员的速度无关紧要;重要的是哪一个产生了预期的结果。

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

我比较了以下速度:

  • $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

您可以看到速度几乎相同。

于 2013-01-25T11:35:03.220 回答
25

首先, === 检查两个参数是否是相同的类型——所以在实际执行任何比较之前,数字 1 和字符串 '1' 在类型检查中失败。另一方面, == 不首先检查类型,而是继续将两个参数转换为相同的类型,然后进行比较。

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

于 2010-03-08T13:16:46.337 回答
7

我真的不知道它是否明显更快,但是 === 在大多数语言中是直接类型比较,而 == 会在必要/可能获得匹配时尝试进行类型强制。

于 2010-03-08T13:16:31.357 回答
4

因为在比较它们之前=== 不需要强制操作数是相同的类型。

我怀疑速度差异很大。在正常情况下,您应该使用更有意义的运算符。

于 2010-03-08T13:17:30.583 回答
4

== 在比较之前会产生更大的类型转换开销。=== 首先检查类型,然后继续进行,无需进行任何类型转换。

于 2010-03-08T13:18:18.343 回答
3

总之 === 更快,因为不要转换数据类型来查看两个变量是否具有相同的值,但是当您需要查看两个变量是否具有相同的值时,您将使用 == if does not mather what type are variables , 或 === if 变量的类型也很重要。

于 2010-03-09T20:03:34.930 回答
1

我发现这两个操作员之间实际上存在显着的速度差异。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%
---------------------------------------------------
于 2020-12-03T13:17:21.650 回答
0

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

于 2018-08-17T15:20:22.377 回答
0

在 php(c 代码)中,值是一个“类”,如:

class value
{
    $int_;
    $float_;
    $string_;
    $array_;
    $object_;
}

当您进行比较$a == $b并且$aint类型时,会出现以下内容:

if ($a->int_ == $b->int_ || $a->int_ == (int) $b->float_ || $a->int_ == (int) $b->string_ || ...)

string '1'不会被转换为 ascii 代码49,它会1

当你比较$a === $b$aint类型时,会有类似的东西:

if ($a->int_ == $b->int_)
于 2020-02-13T07:08:37.433 回答
-3

如果测试结果正确,那么一定是编译器问题,

处理器将在一个时钟周期内执行它被告知要执行的任何操作

如果它有更少的事情,那么它会更快地做

添加:

嗯,实际上如果编译器已经创建了大量要处理的机器代码,那么如果它已经添加了无数的东西来处理需要比较什么类型的数据,那么删除一个“次要”IF 不会对速度产生太大影响一点也不。

如果有人还在读这篇文章,那么我对更多的讨论很感兴趣。

菲尔

于 2015-12-07T21:54:22.160 回答