对于

if ($a === $b)
{
//coding...
}

if ($a == $b)
{
//coding...
}

这2种最简单不过的判断,似乎很少有人关心他们的性能差别,包括我,写了快10年的php似乎从来没有在意过这些。
对我来说,只有在需要严格判断的情况下才会用 === 来判断,大多情况下都是用 == 来判断的。

今天闲来无事手贱测一下这些被遗忘的细节的性能差别,结果却有些让我出乎意料。

测试代码:

// 代码A, === 判断
$a = 'aaa';
$b = 'aaa';
$s = microtime(1);
for($i=0;$i<99999999;$i++) {
if ($a===$b){$c=$a;}
}
echo microtime(1)-$s,"\n";
// 代码B, == 判断
$a = 'aaa';
$b = 'aaa';
$s = microtime(1);
for($i=0;$i<99999999;$i++) {
if ($a==$b){$c=$a;}
}
echo microtime(1)-$s,"\n";

在我电脑上执行代码A和B的结果分别是:
=== 是 4.2317380905151
== 是 5.3882131576538
看来 === 胜出

千万别急着下结论,把代码$a, $b 的值换成 123 试试,结果却出乎我的意料

=== 是 3.3042049407959
== 是 3.091680765152
反而是 == 胜出了

那么再把 $a, $b 的值都赋值成一个 new stdClass(); 是什么结果呢,这个结果在我的意料之中不过也是意料之外
我把 99999999 次循环改成了 199999999 次,结果是:
=== 是 6.6931169033051
== 是 9.5787789821625
结果显示 === 比 == 快 1/3

以上似乎看不出什么差距,后来我又测了一个代码,发现问题来了

// 代码A, === 判断
$a = str_pad('', 99999);
$b = str_pad('', 99999);
$s = microtime(1);
for($i=0;$i<999999;$i++) {
if ($a===$b){$c=$a;}
}
echo microtime(1)-$s,"\n";
// 代码B, == 判断
$a = str_pad('', 99999);
$b = str_pad('', 99999);
$s = microtime(1);
for($i=0;$i<999999;$i++) {
if ($a==$b){$c=$a;}
}
echo microtime(1)-$s,"\n";

没用 99999999 次循环是因为我等了几分钟都还没出结果

最终的结果是:
=== 是 4.435389995575
== 是 57.722193956375

足足有10几倍性能的差距。

可见对于字符串来说,字符越长, === 的性能优势越大于 ==

结论:
如果php的if判断是字符串判断,一定要用 ===, 比 == 不知快多少,而对于整型的判断,== 比 === 快些但是优势不大。
所以判断尽量用 ===

PS:以上测试环境是 5.5.14 ,Mac OS 10.10.1, 2.3 GHz Intel Core i7,16G 1600 MHz DDR3

ps: 后又在php7.1里试了下也是一样的