Почему = = = быстрее, чем == в PHP?

почему === быстрее == в PHP?

10 ответов


потому что оператор равенства == coerces или временно преобразует тип данных, чтобы узнать, равен ли он другому операнду, тогда как === (оператор идентификации) не нужно делать какие-либо преобразования вообще и, таким образом, меньше работы, что делает его быстрее.


=== не выполняет типизацию, поэтому 0 == '0' значение true, а 0 === '0' - to false.


во-первых, = = = проверяет, совпадают ли два аргумента тип - таким образом, число 1 и строка " 1 " терпят неудачу при проверке типа, прежде чем какие-либо сравнения фактически выполняются. С другой стороны, == сначала не проверяет тип, а затем преобразует оба аргумента в один и тот же тип, а затем выполняет сравнение.

следовательно, = = = быстрее при проверке состояния сбоя


есть две вещи, чтобы рассмотреть:

  1. если типы операндов разные, то == и === производства разные результаты. В этом случае скорость операторов не имеет значения; важно, какой из них дает желаемый результат.

  2. если типы операндов одинаковы, вы можете использовать либо == или === и как будет производить те же результаты. В этом случае скорость обоих операторов равна почти идентичный. Это связано с тем, что преобразование типов не выполняется ни одним из операторов.

Я сравнил скорость:

  • $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, какой тип являются переменными, или === если важен также тип переменных.


быстрее не следует просто измерять время прямого выполнения (прямые тесты производительности в этом случае почти незначительны). Тем не менее, мне нужно будет увидеть тест, включающий итерацию или рекурсию, чтобы действительно увидеть, есть ли значительная кумулятивная разница (при использовании в реалистичном контексте). Время тестирования и отладки, которое вы сэкономите при работе с крайними случаями, должно быть значимым для вас, также


Если результаты теста верны, то это должна быть проблема компилятора,

процессор будет делать все, что ему скажут делать на такте

Если у него меньше делать, то это будет быстрее

дополнение:

ну на самом деле, если компилятор уже создал нагрузки машинного кода для обработки, то если он уже добавил миллиарды вещей, чтобы справиться с тем, какой тип данных нуждается в сравнении, то удаление одного "незначительного", если будет не меняйте скорости вообще.

Если кто-то все еще читает это, то мне интересно больше обсуждения.

Фил