【问题标题】:Why is === faster than == in PHP?为什么 === 在 PHP 中比 == 快?
【发布时间】:2011-01-24 23:32:26
【问题描述】:

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

【问题讨论】:

  • 它更快,但它明显更快吗?
  • 请不要阅读 php 中更快的内容。了解如何在不滥用 JOIN 的情况下在单个 SQL 查询中获取有趣的数据。
  • 谁可能对同一主题感兴趣=== vs ==,但在 JAVASCRIPT,可以在这里阅读:stackoverflow.com/questions/359494/…
  • @Piskvor,这不是问题
  • @Pacerier:公平点 - 这就是为什么我只对此发表评论。它没有回答问题,但提供了关于它的观点。

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


【解决方案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%
---------------------------------------------------

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我认为您的意见与 PHP 手册所说的相反。他们说如果 $a 等于 $b,则 $a == $b 为 TRUE,如果 $a 等于 $b,则 $a === $b 为 TRUE,并且它们属于同一类型。
      • 我相信这实际上是 2 个操作数指向复杂类型的相同内存区域,但 meder 的回答包含了这一点
      • 这是有道理的(就像在 JS 中一样),但如果有人还添加对一些真正简单的性能测试的引用,那就太好了。
      • phpbench.com 在“控制结构”部分显示 == 和 === 之间的性能差异。
      • 好的,那么只使用if(value) 而不是if(value===true) 或if(value==true) 会有什么不同吗?
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        如果它做的更少,那么它会做的更快

        加法:

        实际上,如果编译器已经创建了大量要处理的机器代码,那么如果它已经添加了无数的东西来处理需要比较的数据类型,那么删除一个“次要”IF 将不会完全改变速度。

        如果有人还在读这篇文章,那么我有兴趣进行更多讨论。

        菲尔

        【讨论】:

        • 您的代码库中是否只有“一个”IF 语句?这很奇怪,因为在我处理过的每个代码库中,我们都有成千上万的 IF 或比较语句到处调用。
        【解决方案6】:

        有两点需要考虑:

        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
        

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

        【讨论】:

        • 我想知道如果你在一台不做任何其他事情的机器上进行数十亿次迭代并只输出平均值会发生什么。看起来这里有很多噪音。 ;)
        • 我得出了相同的结论:如果已知操作数来自同一类型,则不会有任何区别。其他情况没有意义。几乎所有其他答案都是错误的。
        • 我相信这应该是选择的答案。它不只是用假设来合理化,这些假设或多或少地经过了经验检验。
        • @PedroAmaralCouto 我不这么认为,因为 10 不是实证研究。几乎没有区别的主要原因是 PHP 编译器可能会优化代码。除非需要类型转换,否则应该使用 === ,这将有助于减少语义错误(即使它一生中只有一次)。它还可以帮助下一个阅读代码的人执行哪些规则。写一次,读几百遍,如果能解一个人的疑惑,就已经成功了。如果是经验的,也没有内存测试,因为克隆到相同的类型。资源不仅仅是时间。
        • @Marco,当我说“实证研究”时,我的意思是它基于经验,例如:运行代码而不是仅使用原因(或您的想法)进行论证,而无需进行实验把它备份。 Salman A 值表明 === 有时更快,有时更慢。这意味着“为什么 === 在 PHP 中比 == 快?”提出了一个问题:“你怎么知道 === 比 == 快?编译器优化是一个解释,而不是更快或更慢,我没有说应该使用什么。
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          因为=== doesn't need to coerce the operands to be of the same type 在比较它们之前。

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

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

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

                【讨论】:

                • 我猜== 也会先检查类型,看看是否需要进行任何类型转换。 === 在接下来的步骤中没有进行任何转换,这一事实使它更快。
                【解决方案12】:

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

                【讨论】:

                • Javascript 有 === 操作符。
                • 我相信你可以在 common lisp 和 scheme 中做到 ===。
                • Javascript - 不在我检查的 3 种语言定义中;) Lisp 和 Scheme 有很多东西,但几乎不常见;)
                • 红宝石有 ===。我已经太久不记得它是否做同样的事情了。
                • 另外,livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/… 用于操作脚本。基本上,谷歌“严格平等”。
                猜你喜欢
                • 2019-11-02
                • 2014-05-27
                • 1970-01-01
                • 2017-01-11
                • 2015-07-24
                • 1970-01-01
                相关资源
                最近更新 更多