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

时间:2010-03-08 13:14:19

标签: php operators comparison-operators equality-operator identity-operator

为什么===比PHP中的==更快?

12 个答案:

答案 0 :(得分:191)

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

答案 1 :(得分:53)

===不执行类型转换,因此0 == '0'评估为true0 === '0'评估为false

答案 2 :(得分:25)

首先,===检查两个参数是否相同类型 - 因此在进行任何比较之前,数字1和字符串“1”在类型检查上失败。另一方面,==不会先检查类型,然后继续将两个参数转换为相同的类型然后进行比较。

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

答案 3 :(得分:21)

有两件事需要考虑:

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

  2. 如果操作数类型相同,则可以使用=====,因为两者都会产生相同的结果。在这种情况下,两个运营商的速度几乎相同。这是因为任何一个运营商都没有进行类型转换。

  3. 我比较了以下的速度:

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

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

答案 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$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_)

答案 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根本不会改变速度。

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

菲尔