为什么 PHP 中 === 比 == 更快?
为什么 PHP 中 ===
比 ==
更快?
Why is ===
faster than ==
in PHP?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
为什么 PHP 中 ===
比 ==
更快?
Why is ===
faster than ==
in PHP?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(12)
因为相等运算符
==
会临时强制或转换数据类型以查看它是否等于另一个操作数,而===
(恒等运算符)则不会不需要进行任何转换,因此完成的工作更少,这使得速度更快。Because the equality operator
==
coerces, or converts, the data type temporarily to see if it’s equal to the other operand, whereas===
(the identity operator) doesn’t need to do any converting whatsoever and thus less work is done, which makes it faster.===
不执行类型转换,因此0 == '0'
计算结果为true
,但0 === '0 '
- 为false
。===
does not perform typecasting, so0 == '0'
evaluates totrue
, but0 === '0'
- tofalse
.有两件事需要考虑:
如果操作数类型不同,则
==
和===
会产生不同的结果。在这种情况下,操作员的速度并不重要;重要的是哪一个产生所需的结果。如果操作数类型相同,则可以使用
==
或===
,因为两者都会产生相同的结果。在这种情况下,两个操作员的速度几乎相同。这是因为这两个运算符均不执行类型转换。我比较了以下速度:
$a == $b
与$a === $b
$a
和$b
是随机整数 [1, 100],结果如下:
您可以看到速度几乎相同。
There are two things to consider:
If operand types are different then
==
and===
produce different results. In that case the speed of the operators does not matter; what matters is which one produces the desired result.If operand types are same then you can use either
==
or===
as both will produce same results. In that case the speed of both operators is almost identical. This is because no type conversion is performed by either operators.I compared the speed of:
$a == $b
vs$a === $b
$a
and$b
were random integers [1, 100]And here are the results:
You can see that the speed is almost identical.
首先, === 检查两个参数的类型是否相同 - 因此在实际进行任何比较之前,数字 1 和字符串“1”在类型检查中失败。另一方面, == 不会首先检查类型,而是继续将两个参数转换为相同类型,然后进行比较。
因此, === 可以更快地检查失败条件
First, === checks to see if the two arguments are the same type - so the number 1 and the string '1' fails on the type check before any comparisons are actually carried out. On the other hand, == doesn't check the type first and goes ahead and converts both arguments to the same type and then does the comparison.
Therefore, === is quicker at checking a fail condition
我真的不知道它是否明显更快,但是在大多数语言中 === 是直接类型比较,而 == 如果需要/可能会尝试进行类型强制以获得匹配。
I don't really know if it's significantly faster, but === in most languages is a direct type comparison, while == will try to do type coercion if necessary/possible to gain a match.
== 在比较之前会产生较大的类型转换开销。 === 首先检查类型,然后继续进行,无需进行任何类型转换。
The == incurs a larger overhead of type conversion before comparison. === first checks the type, then proceeds without having to do any type conversion.
因为
===
不在比较操作数之前需要强制操作数为相同类型。我怀疑速度差异是否很大。在正常情况下,您应该使用更有意义的运算符。
Because
===
doesn't need to coerce the operands to be of the same type before comparing them.I doubt the difference in speed is very much though. Under normal circumstances you should use whichever operator makes more sense.
总之 === 更快,因为不转换数据类型来查看两个变量是否具有相同的值,但是当您需要查看两个变量是否具有相同的值时,如果不关心变量是什么类型,您将使用 == , 或 === if 变量的类型也很重要。
In conclusion === is faster because don't converts the data type to see if two variables have same value, but when you need to see if two variables have same value you will use == if doesen't mather what type are variables, or === if is important also the type of variables.
我发现两个操作员之间实际上存在显着的速度差异。下面是在 docker 容器中运行的 php 8.0.0 RC5 和 php 7.4.12 的结果。该项目托管在 github 上,以便每个人都可以查看该方法。免责声明:我构建了该工具。
I found out that there actually is a significant speed difference between the 2 operators. Results for php 8.0.0 RC5 and php 7.4.12 running in docker container below. The project is hosted on github so everyone can review the methodology. Disclaimer: I built the tool.
在 php(c 代码)中,值是一个“类”,例如:
当您比较
$a == $b
和$a
时,$a == $b
是int
类型,会有类似这样的内容:但是
string
'1'
不会被转换为 ascii 代码49
,它将是1
。当你比较
$a === $b
和$a
是int
类型时,会有类似这样的内容:In php (c code) value is a "class" like:
When your are comparing
$a == $b
and$a
isint
type, there will be something like:but
string
'1'
will not be cast to ascii code49
, it will be1
.When you are comparing
$a === $b
and$a
isint
type, there will be someting like:更快不应仅以直接执行时间来衡量(在这种情况下,直接性能测试几乎可以忽略不计)。也就是说,我需要查看涉及迭代或递归的测试,以真正查看是否存在显着的累积差异(当在现实环境中使用时)。处理边缘情况时节省的测试和调试时间对您来说也应该很有意义
Faster should not just be measured in direct execution time (direct performance tests are almost negligible in this case). That said, I would need to see a test involving iteration, or recursion, to really see if there is a significant, cumulative difference (when used in a realistic context). The testing and debugging time you will save when dealing with edge cases should be meaningful to you, also
如果测试结果正确,那么它一定是编译器问题,
处理器将在一个时钟周期内执行它被告知要做的任何事情
如果它要做的事情较少,那么它会更快地执行
添加:
嗯,实际上,如果编译器已经创建了大量要处理的机器代码,那么如果它已经添加了无数的东西来处理需要比较的数据类型,那么删除一个“次要”IF 根本不会改变速度。
如果有人仍然阅读本文,那么我有兴趣进行更多讨论。
菲尔
If the test results are correct, then it must be a compiler issue,
The processor will do whatever it is told to do on a clock cycle
If it has less to do then it will be quicker to do
Addition:
Ah well actually if the compiler has already created loads of machine code to be processed, then if it has already added zillions of stuff to cope with what type of data needs comparing, then the removal of one "minor" IF will not change speeds much at all.
If anyone still reads this are then I am interesting in more discussion.
Phil