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


168

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


40
它更快,但是明显更快吗?
Piskvor在

19
请不要阅读有关php中更快的内容的信息。了解如何在不滥用JOIN的情况下在单个SQL查询中获取有趣的数据。
卡米尔·索佐特

15
谁可能是感兴趣的同一主题=== vs ==,但在JavaScript中,可以在这里阅读:stackoverflow.com/questions/359494/...
马尔科Demaio

5
@Piskvor,这不是问题
Pacerier

6
@Pacerier:公平点-这就是为什么我只对此发表评论。它没有回答问题,但提供了有关此问题的观点。
Piskvor于

Answers:


200

因为相等运算符会==强制转换或转换数据类型,以查看其是否等于另一个操作数,而===(身份运算符)则无需执行任何转换,因此工作量减少,从而使速度更快。


我认为您的意见与PHP手册所说的相反。他们说,如果$ a等于$ b,则$ a == $ b是TRUE,而如果$ a等于$ b,则$ a === $ b是TRUE,并且它们是同一类型。
巴赫蒂奥尔

92
那怎么相反呢?
meder omuraliev 2010年

2
我认为实际上是2个操作数指向复杂类型的相同内存区域,但是meder的答案包括这一点
基本的2010年

1
这是有道理的(就像在JS中一样),但是如果有人还添加了对一些真正的简单性能测试的引用,那将是很好的。
Marco Demaio 2010年

4
phpbench.com在“控制结构”部分下显示了==和===之间的性能差异。
ekillaby

54

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


25

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

因此,===可以更快地检查失败情况


8
我猜想它==还会先检查类型,看看是否需要进行任何类型转换。===在接下来的步骤中不进行任何转换的事实使其变得更快。
deceze

25

有两件事要考虑:

  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

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


13
我想知道如果您在一台不执行其他任何操作而仅输出平均值的计算机上进行数十亿次迭代会发生什么。好像这里有很多杂音。;)
Gung Foo 2013年

4
我得出了相同的结论:如果已知操作数来自同一类型,则不会造成任何差异。其他情况没有意义。几乎所有其他答案都是错误的。
Paul Spiegel

1
我相信这应该是选择的答案。它不只是根据假设进行合理化,这些假设在经验上的检验或多或少。
Pedro Amaral Couto

@PedroAmaralCouto我不这么认为,因为10不是一项实证研究。几乎没有区别的主要原因是PHP编译器可能会优化代码。除非需要类型转换,否则应该使用===,这将有助于减少语义错误(即使您一生中只有一次)。它还可以帮助下一个阅读代码的人执行哪些规则。你写一次,读过几百遍,如果它可以帮助消除一个人的疑惑,那就已经成功了。如果为Empirical,也不会进行内存测试,因为克隆到相同类型。资源多于时间。
马可(Marco)

@Marco,当我说“实证研究”时,我的意思是它是基于经验的,例如:运行代码而不是仅使用原因(或您的想法)进行论证,而没有进行实验的支持。Salman A值表明===有时有时会快一些,有时会慢一些。这意味着“为什么===比PHP中的==快?” 提出了一个问题:“您怎么知道===比==快?编译器优化是一种解释,不是更快或更慢的解释,我没有说应该使用什么。
Pedro Amaral Couto

7

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


9
Javascript具有===运算符。
Frank Shearar 2010年

我确定您可以在常见的Lisp和方案中执行===。
pupeno

Javascript-不是我检查过的3种语言定义;)Lisp和Scheme是很多东西,但很少见;)
TomTom 2010年

1
红宝石有===。我记不起它是否做同样的事情已经太久了。
KitsuneYMG 2010年

1
另外,请访问livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/…获取动作脚本。基本上,谷歌“严格平等”。
克里斯(Chris)2010年

4

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



3

结论===更快,因为不转换数据类型以查看两个变量是否具有相同的值,但是当您需要查看两个变量是否具有相同的值时,将使用==如果不计算变量的类型,或者===如果变量的类型也很重要。


0

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


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

-4

如果测试结果正确,则必须是编译器问题,

处理器将在一个时钟周期内执行所指示的所有操作

如果要做的事少,那就会更快

加成:

嗯,实际上,如果编译器已经创建了要处理的机器代码负载,那么如果它已经添加了成千上万的内容来应付需要比较的数据类型,那么删除一个“较小”的IF不会改变速度。完全没有

如果仍然有人读过这篇文章,那么在更多讨论中我会很有趣。

菲尔


您的代码库中是否只有“一个” IF语句?这很奇怪,因为在我处理过的每个代码库中,到处都有成千上万的IF或比较语句被调用。
列夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.