Почему = = = быстрее, чем == в PHP?
почему ===
быстрее ==
в PHP?
10 ответов
потому что оператор равенства ==
coerces или временно преобразует тип данных, чтобы узнать, равен ли он другому операнду, тогда как ===
(оператор идентификации) не нужно делать какие-либо преобразования вообще и, таким образом, меньше работы, что делает его быстрее.
во-первых, = = = проверяет, совпадают ли два аргумента тип - таким образом, число 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, какой тип являются переменными, или === если важен также тип переменных.
быстрее не следует просто измерять время прямого выполнения (прямые тесты производительности в этом случае почти незначительны). Тем не менее, мне нужно будет увидеть тест, включающий итерацию или рекурсию, чтобы действительно увидеть, есть ли значительная кумулятивная разница (при использовании в реалистичном контексте). Время тестирования и отладки, которое вы сэкономите при работе с крайними случаями, должно быть значимым для вас, также
Если результаты теста верны, то это должна быть проблема компилятора,
процессор будет делать все, что ему скажут делать на такте
Если у него меньше делать, то это будет быстрее
дополнение:
ну на самом деле, если компилятор уже создал нагрузки машинного кода для обработки, то если он уже добавил миллиарды вещей, чтобы справиться с тем, какой тип данных нуждается в сравнении, то удаление одного "незначительного", если будет не меняйте скорости вообще.
Если кто-то все еще читает это, то мне интересно больше обсуждения.
Фил