PHP 异或性能

PHP XOR performance

我知道异或等于不等于,但我想在这里问一下性能差异的原因。我知道它可以忽略不计,但我很想知道为什么会这样。

分析

我自己的测试:

$ php -r '$a=true; $b=true;
$start = microtime(true);
for($i = 0; $i < 0xFFFFFF; $i++) $a xor $b;
$end = microtime(true);
echo ($end - $start) / 0xFFFFFF;
2.8898769545694E-8
$ php -r '$a=true; $b=true;
$start = microtime(true);
for($i = 0; $i < 0xFFFFFF; $i++) $a !== $b;
$end = microtime(true);
echo ($end - $start) / 0xFFFFFF;
'
2.735811385077E-8
$ php -r '$a=true; $b=true;
$start = microtime(true);
for($i = 0; $i < 0xFFFFFF; $i++) $a != $b;
$end = microtime(true);
echo ($end - $start) / 0xFFFFFF;
'
3.2480544635878E-8
$ php -r '$a=true; $b=true;
$start = microtime(true);
for($i = 0; $i < 0xFFFFFF; $i++) $a xor $b;
$end = microtime(true);
echo ($end - $start) / 0xFFFFFF;
'
2.9041645487517E-8
$ php -r '$a=true; $b=true;
$start = microtime(true);
for($i = 0; $i < 0xFFFFFF; $i++) $a !== $b;
$end = microtime(true);
echo ($end - $start) / 0xFFFFFF;
'
2.7436373032351E-8
$ php -r '$a=true; $b=true;
$start = microtime(true);
for($i = 0; $i < 0xFFFFFF; $i++) $a != $b;
$end = microtime(true);
echo ($end - $start) / 0xFFFFFF;
'
3.2506237862734E-8

平均:

我想问:

为什么这些运算符有如此显着的性能?

我实际上又做了几次这些测试,!== 总是比 xor 快,而且都比 != 快得多(超过 10%)。

我认为这可能是因为 != 忽略了数据类型。 Php 处理器需要将两个变量转换为相同的数据类型以便进行比较。 Xor 将两个变量都作为布尔值,可以直接比较而不需要转换。 !== 将 return false 如果数据类型不同,也不进行转换。

来自 PHP 5.6.0 的 VLD 输出,用于对三个选项进行简单测试:

$a=true; $b=true;
$x = $a xor $b;

echo '-';

$a=true; $b=true;
$x = $a !== $b;

echo '-';

$a=true; $b=true;
$x = $a != $b;

给予

Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /in/OLfo9
function name:  
number of ops:  16
compiled vars:  !0 = $a, !1 = $b, !2 = $x
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   3     0  E >   ASSIGN                                                   !96, 
         1        ASSIGN                                                   !112, 
   4     2        ASSIGN                                                 !128, !96
         3        BOOL_XOR                                         ~6      , !112
         4        FREE                                                     ~6
   6     5        ECHO                                                     '-'
   8     6        ASSIGN                                                   !96, 
         7        ASSIGN                                                   !112, 
   9     8        IS_NOT_IDENTICAL                                 ~9      !96, !112
         9        ASSIGN                                                   !128, ~9
  11    10        ECHO                                                     '-'
  13    11        ASSIGN                                                   !96, 
        12        ASSIGN                                                   !112, 
  14    13        IS_NOT_EQUAL                                     ~13     !96, !112
        14        ASSIGN                                                   !128, ~13
        15      > RETURN                                                   1

所以xor确实创建了一个临时结果,随后被释放