151

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

+35

Это быстрее, но значительно ли это * быстрее? – Piskvor

+18

Пожалуйста, не читайте о том, что быстрее в php. Читайте о том, как получить интересные данные в одном SQL-запросе, не злоупотребляя JOIN. –

+15

Кому может быть интересно эту тему: === vs == ', но в JAVASCRIPT можно прочитать здесь: http://stackoverflow.com/questions/359494/javascript-vs-does-it-matter- который-equal-operator-i-use –

ответ

173

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

+0

Я думаю, ваше мнение противоречит тому, что говорит PHP Manual. Они говорят, что $ a == $ b TRUE, если $ a равно $ b, где $ a === $ b TRUE, если $ a равно $ b, и они одного типа. – Bakhtiyor

+81

Как это противоречит? –

+2

Я считаю, что на самом деле два операнда указывают на одну и ту же область памяти для сложных типов, но ответ медитера включает в себя то, что – Basic

7

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

+9

Javascript имеет оператор ===. –

+0

Я уверен, что вы можете сделать === в общем lisp и схеме. – Pablo

+0

Javascript - не в 3 определениях langauge, которые я проверил;) И Lisp и Scheme много чего, но вряд ли распространены;) – TomTom

22

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

Поэтому === быстрее при проверке неисправности условию

+6

Я бы предположил, что '==' также проверяет тип, чтобы увидеть, нужно ли преобразовывать какие-либо типы.Тот факт, что '===' не делает никакого преобразования на следующем шаге, - это то, что делает его быстрее. – deceze

4

Потому что ===doesn't need to coerce the operands to be of the same type перед их сравнением.

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

49

=== не выполняет типажей, поэтому 0 == '0' вычисляет true, но 0 === '0' - к false.

4

== При использовании более ранних версий преобразования типов перед сравнением. === сначала проверяет тип, затем переходит без необходимости преобразования любого типа.

2

В заключение === быстрее, потому что не преобразует тип данных, чтобы увидеть, имеют ли две переменные одинаковое значение, но когда вам нужно увидеть, имеют ли две переменные одинаковое значение, вы будете использовать == if doesen't mather какой тип - переменные, или === если важно также тип переменных.

12

Есть две вещи, чтобы рассмотреть следующие вопросы:

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

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

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

  • $a == $b против $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 

Вы можете видеть, что скорость почти одинакова.

+9

Интересно, что произойдет, если вы сделаете несколько миллиардов итераций на машине, которая ничего не делает и просто выдает среднее значение. похоже, здесь много шума. ;) –

+1

Я пришел к такому же выводу: никакой разницы не может быть беспорядочно, если известно, что операнды принадлежат к одному типу. Другие сценарии не имеют смысла. Почти все другие ответы просто неверны. –

-2

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

Процессор будет делать все, что он сказал, чтобы сделать на тактовый цикл

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

Дополнение:

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

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

Phil

Смежные вопросы