Почему = = = быстрее, чем == в PHP?
почему ===
быстрее ==
в PHP?
10 ответов:
потому что оператор равенства
==
принудительно или временно преобразует тип данных, чтобы узнать, равен ли он другому операнду, тогда как===
(оператор идентификации) не нужно делать никаких преобразований вообще и, таким образом, меньше работы делается, что делает его быстрее.
во-первых, === проверяет, являются ли два аргумента одинаковыми тип - таким образом, число 1 и строка '1' терпят неудачу при проверке типа, прежде чем какие-либо сравнения фактически выполняются. С другой стороны, = = сначала не проверяет тип, а затем преобразует оба аргумента в один и тот же тип, а затем выполняет сравнение.
поэтому, = = = быстрее при проверке состояния сбоя
есть две вещи, чтобы рассмотреть:
если типы операндов различны, то
==
и===
производства разные результаты. В этом случае скорость операторов не имеет значения; важно то, какой из них дает желаемый результат.если типы операндов одинаковы, то вы можете использовать либо
==
или===
и как будет производить те же результаты. В этом случае скорость обоих операторов равна почти идентичный. Это связано с тем, что ни один из операторов не выполняет преобразование типов.Я сравнил скорость:
$a == $b
vs$a === $b
- здесь
$a
и$b
случайные целые числа [1, 100]- эти две переменные были сгенерированы и сравнивались миллион раз
- тесты были выполнены 10 раз
и вот результаты:
$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
вы можете увидеть что скорость почти одинаковая.
Я действительно не знаю, если это значительно быстрее, но === в большинстве языков является прямым сравнением типов, в то время как == будет пытаться сделать принуждение типа, если это необходимо/возможно, чтобы получить совпадение.
the == несет большие накладные расходы на преобразование типов перед сравнением. = = = сначала проверяет тип, а затем продолжает без необходимости делать какие-либо преобразования типов.
, потому что
===
не нужно принуждать операнды должны быть одного типа прежде чем сравнивать их.Я сомневаюсь, что разница в скорости очень много, хотя. При нормальных обстоятельствах вы должны использовать тот оператор, который имеет больше смысла.
В заключение === быстрее, потому что не преобразует тип данных, чтобы увидеть, если две переменные имеют одинаковое значение, но когда вам нужно увидеть, если две переменные имеют одинаковое значение вы будете использовать == если doesen't mather, какой тип переменных, или === если важно также тип переменных.
быстрее не следует просто измерять время прямого выполнения (прямые тесты производительности в этом случае почти незначительны). Тем не менее, мне нужно было бы увидеть тест, включающий итерацию или рекурсию, чтобы действительно увидеть, есть ли значительная кумулятивная разница (при использовании в реалистичном контексте). Время тестирования и отладки, которое вы сэкономите при работе с крайними случаями, также должно быть значимым для вас
Если результаты теста верны, то это должна быть проблема компилятора,
процессор будет делать все, что ему говорят делать на тактовом цикле
Если у него меньше делать, то это будет быстрее
дополнение:
ну на самом деле, если компилятор уже создал множество машинных кодов для обработки, то если он уже добавил миллионы вещей, чтобы справиться с тем, какой тип данных нуждается в сравнении, то удаление одного "второстепенного", если будет не меняйте скорости сильно вообще.
Если кто-то все еще читает это, то мне интересно больше обсуждать.
Фил