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

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

35906 次浏览

因为等式操作符 ==会临时强制或转换数据类型,以查看它是否等于其他操作数,而 ===(标识操作符)不需要进行任何转换,因此完成的工作更少,这使得转换速度更快。

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

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

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

因为在比较它们之前。

不过我怀疑速度上的差异有多大。在正常情况下,您应该使用任何更有意义的操作符。

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

在比较之前,= = 会导致更大的类型转换开销。= = = 首先检查类型,然后不必进行任何类型转换就可以继续。

总之,= = = 更快,因为不需要转换数据类型来判断两个变量是否有相同的值,但是当你需要判断两个变量是否有相同的值时,你可以使用 = = ,如果不关心变量的类型,或者 = = = ,如果变量的类型也很重要。

有两件事需要考虑:

  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

你可以看到速度几乎是一样的。

如果测试结果是正确的,那么肯定是编译器出了问题,

处理器会在一个时钟周期内按照指示做任何事情

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

附加:

实际上,如果编译器已经创建了大量的机器代码来进行处理,那么如果编译器已经添加了数以亿计的代码来处理需要比较的数据类型,那么删除一个“次要的”IF 根本不会改变速度。

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

菲尔

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

在 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_)

我发现这两个操作者之间的速度差别很大。在下面的 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%
---------------------------------------------------