Я знаю, что 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%) быстрее, чем !=
,
Выход 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
действительно создает временный результат, который впоследствии освобождается
Я думаю, что, вероятно, из-за! = Пренебрегает типом данных. Процессору php необходимо преобразовать обе переменные в один и тот же тип данных для сравнения.
Xor, принимая обе переменные как логические, может сравнивать напрямую без преобразования. ! == вернет false, если тип данных отличается, также без преобразования.