首页
学习
活动
专区
圈层
工具
发布

PHP性能
EN

Stack Overflow用户
提问于 2016-02-01 14:43:49
回答 2查看 156关注 0票数 0

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

分析

我自己的测试:

代码语言:javascript
复制
$ 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:28.9 ns
  • !==:27.4 ns
  • !=:32.5ns

我想问:

为何这些营办商有如此显著的表现?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-01 15:03:24

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

代码语言:javascript
复制
$a=true; $b=true;
$x = $a xor $b;

echo '-';

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

echo '-';

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

给出

代码语言:javascript
复制
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                                           $5      !128, !96
         3        BOOL_XOR                                         ~6      $5, !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实际上正在创建一个临时结果,该结果随后被释放。

票数 2
EN

Stack Overflow用户

发布于 2016-02-01 15:01:13

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35133367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档