Производительность PHP XOR

Я знаю, что XOR такой же, как и не равный, но я хочу спросить причину разницы в производительности здесь. Я знаю, что это незначительно, но мне любопытно узнать, почему это происходит.

Анализ

Мои собственные тесты:

$ 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 нс
  • !==: 27,4 нс
  • !=: 32,5 нс

Почему эти операторы имеют такую ​​значительную производительность?

Я сделал эти тесты еще несколько раз, и !== всегда быстрее чем xorи оба значительно (более чем на 10%) быстрее, чем !=,

0

Решение

Выход VLD из PHP 5.6.0 для простого тестирования трех вариантов:

$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                                           $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

Другие решения

Я думаю, что, вероятно, из-за! = Пренебрегает типом данных. Процессору php необходимо преобразовать обе переменные в один и тот же тип данных для сравнения.
Xor, принимая обе переменные как логические, может сравнивать напрямую без преобразования. ! == вернет false, если тип данных отличается, также без преобразования.

-1

По вопросам рекламы [email protected]