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


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

10 159

10 ответов:

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

=== не выполняет типизацию, поэтому 0 == '0' значение true, а 0 === '0' до 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, какой тип переменных, или === если важно также тип переменных.

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

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

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

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

дополнение:

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

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

Фил