Почему ===
быстрее, чем ==
в PHP?
=== vs ==
, но в JAVASCRIPT, можете прочитать здесь: stackoverflow.com/questions/359494/…
Почему ===
быстрее, чем ==
в PHP?
=== vs ==
, но в JAVASCRIPT, можете прочитать здесь: stackoverflow.com/questions/359494/…
Ответы:
Поскольку оператор равенства ==
принуждает или преобразует тип данных временно, чтобы увидеть, равен ли он другому операнду, в то ===
время как (оператору идентичности) не требуется выполнять какое-либо преобразование, и поэтому выполняется меньше работы, что делает его более быстрым.
Во-первых, === проверяет, являются ли два аргумента одного типа поэтому число 1 и строка «1» завершаются неудачно при проверке типа перед тем, как будут выполнены какие-либо сравнения. С другой стороны, == сначала не проверяет тип, а затем преобразует оба аргумента в один и тот же тип, а затем выполняет сравнение.
Следовательно, === быстрее проверяет состояние ошибки
==
сначала также проверяется тип, чтобы узнать, нужно ли выполнять какое-либо преобразование типа. Тот факт, что ===
на следующем шаге не выполняется никакого преобразования, делает его более быстрым.
Есть две вещи для рассмотрения:
Если типы операндов различны, то ==
и ===
дают разные результаты . В этом случае скорость операторов не имеет значения; важно то, какой из них дает желаемый результат.
Если типы операндов одинаковы, вы можете использовать один из них ==
или ===
оба будут давать одинаковые результаты . В этом случае скорость обоих операторов практически одинакова. Это связано с тем, что ни один из операторов не выполняет преобразование типов.
Я сравнил скорость:
$a == $b
против $a === $b
$a
и $b
были случайные целые числа [1, 100]И вот результаты:
$a == $b $a === $b
--------- ---------
0.765770 0.762020
0.753041 0.825965
0.770631 0.783696
0.787824 0.781129
0.757506 0.796142
0.773537 0.796734
0.768171 0.767894
0.747850 0.777244
0.836462 0.826406
0.759361 0.773971
--------- ---------
0.772015 0.789120
Вы можете видеть, что скорость почти идентична.
I don't really know if it's significantly faster, but === in most languages is a direct type comparison, while == will try to do type coercion if necessary/possible to gain a match.
Because ===
doesn't need to coerce the operands to be of the same type before comparing them.
Я сомневаюсь, что разница в скорости очень большая, хотя. При нормальных обстоятельствах вы должны использовать тот оператор, который имеет больше смысла.
В заключение === быстрее, потому что не преобразует тип данных, чтобы увидеть, если две переменные имеют одинаковое значение, но когда вам нужно увидеть, если две переменные имеют одинаковое значение, вы будете использовать ==, если не важно, какой тип являются переменными или === если важен также тип переменных.
Быстрее следует измерять не только во время непосредственного выполнения (прямые тесты производительности в этом случае практически ничтожны). Тем не менее, мне нужно будет увидеть тест, включающий в себя итерацию или рекурсию, чтобы действительно увидеть, есть ли существенная кумулятивная разница (при использовании в реалистическом контексте). Время тестирования и отладки, которое вы сэкономите при работе с крайними случаями, также должно быть значимым для вас.
В php (c code) значением является «класс», такой как:
class value
{
$int_;
$float_;
$string_;
$array_;
$object_;
}
Когда ваш сравнивают $a == $b
и $a
является int
типом, то будет что - то вроде:
if ($a->int_ == $b->int_ || $a->int_ == (int) $b->float_ || $a->int_ == (int) $b->string_ || ...)
но string
'1'
не будет приведен к ASCII-коду 49
, это будет1
.
Когда вы сравниваете $a === $b
и $a
является int
тип, будет , как коснуться:
if ($a->int_ == $b->int_)
Если результаты теста верны, то это должно быть проблемой компилятора,
Процессор будет делать все, что ему говорят, за такт
Если будет меньше, то будет быстрее
Дополнение:
Ну, на самом деле, если компилятор уже создал множество машинного кода для обработки, то, если он уже добавил миллиарды вещей, чтобы справиться с тем, какой тип данных требует сравнения, то удаление одного «второстепенного» IF не изменит скорости сильно вообще.
Если кто-то все еще читает это, то мне интересно больше обсуждать.
Фил