为什么在 PHP 中 ===比 ==快?
===
==
因为等式操作符 ==会临时强制或转换数据类型,以查看它是否等于其他操作数,而 ===(标识操作符)不需要进行任何转换,因此完成的工作更少,这使得转换速度更快。
我不知道它是否明显地更快,但是 = = = 在大多数语言中是直接的类型比较,而 = = 在必要/可能的情况下会尝试进行类型强制以获得匹配。
首先,= = = 检查两个参数是否是相同的 类型-因此在实际执行任何比较之前,数字1和字符串‘1’在类型检查中失败。另一方面,= = 没有首先检查类型,而是继续将两个参数转换为同一类型,然后进行比较。
因此,= = = 在检查失败条件时更快
因为在比较它们之前。
不过我怀疑速度上的差异有多大。在正常情况下,您应该使用任何更有意义的操作符。
===不执行类型转换,因此 0 == '0'的计算结果为 true,而 0 === '0'-为 false。
0 == '0'
true
0 === '0'
false
在比较之前,= = 会导致更大的类型转换开销。= = = 首先检查类型,然后不必进行任何类型转换就可以继续。
总之,= = = 更快,因为不需要转换数据类型来判断两个变量是否有相同的值,但是当你需要判断两个变量是否有相同的值时,你可以使用 = = ,如果不关心变量的类型,或者 = = = ,如果变量的类型也很重要。
有两件事需要考虑:
如果操作数类型不同,则 ==和 ===产生 不同的结果。在这种情况下,运算符的速度并不重要; 重要的是哪一个运算符产生所期望的结果。
如果操作数类型相同,那么可以使用 ==或 ===,因为两者都会产生 同样的结果。在这种情况下,两个运算符的速度几乎相同。这是因为两个运算符都不执行类型转换。
我比较了:
$a == $b
$a === $b
$a
$b
结果如下:
$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和 $a是 int类型时,会有这样的东西:
int
if ($a->int_ == $b->int_ || $a->int_ == (int) $b->float_ || $a->int_ == (int) $b->string_ || ...)
但是 string '1'将不会被转换为 ASCII 码 49,它将是 1。
string
'1'
49
1
当你比较 $a === $b和 $a是 int类型时,你会发现:
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% ---------------------------------------------------