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


168

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


40
Это быстрее, но значительно ли быстрее?
Писквор покинул здание

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

15
Кому это может быть интересно на ту же тему === vs ==, но в JAVASCRIPT, можете прочитать здесь: stackoverflow.com/questions/359494/…
Marco Demaio

5
@Piskvor, это не вопрос
Pacerier

6
@Pacerier: Справедливо, вот почему я только прокомментировал это. Он не отвечает на вопрос, но дает представление о нем.
Писквор покинул здание

Ответы:


200

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


I think your opinion is contrary with the what PHP Manual says. They say $a == $b is TRUE if $a is equal to $b, where $a === $b is TRUE if $a is equal to $b, and they are of the same type.
Bakhtiyor

92
How is it contrary, then?
meder omuraliev

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

1
Это имеет смысл (как и в JS), но было бы неплохо, если бы кто-то добавил также ссылку на некоторые очень простые тесты производительности.
Марко Демайо

4
На phpbench.com указана разница в производительности между == и === в разделе «Структуры управления».
ekillaby

54

===не выполняет приведение типов, поэтому 0 == '0'оценивает true, но 0 === '0'- в false.


25

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

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


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

25

Есть две вещи для рассмотрения:

  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

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


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

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

1
Я считаю, что это должен был быть выбранный ответ. Это не просто обоснование с предположениями, предположения были более или менее проверены эмпирически.
Педро Амарал Коуту

@PedroAmaralCouto I don't think so, since 10 is not an empirical study. The main reason there is near no difference is that the PHP compiler will probably optimize the code. One should use === unless type conversion is needed, it will help to reduce semantic error (even if it's once in your entire life). It also helps the next person reading the code what rules are enforced. You write once, it's read a few hundred times, if it can help clear up one person's doubt, it's already succeeded. Also no memory test if Empirical, since clone to same type. There are more resources than only time.
Marco

@ Марко, когда я говорю «эмпирическое исследование», я имею в виду, что оно основано на опыте, например: выполнение кода вместо аргумента, используя только причину (или то, что у вас на уме), без эксперимента для его подтверждения. Значения Salman A показывают, что === одинаково иногда немного быстрее, а иногда немного медленнее. Это означает «Почему === быстрее, чем == в PHP?» Напрашивается вопрос: «Как вы знаете, === быстрее, чем ==»? Оптимизация компилятора - это объяснение, а не то, что быстрее или медленнее, и я не сказал, что следует использовать.
Педро Амарал Коуту

7

I don't really know if it's significantly faster, but === in most languages is a direct type comparison, while == will try to do type coercion if necessary/possible to gain a match.


9
Javascript has the === operator.
Frank Shearar

I'm sure you can do === in common lisp and scheme.
pupeno

Javascript - not in 3 langauge definitions I checked ;) And Lisp and Scheme are many things, but hardly common ;)
TomTom

1
ruby has ===. It has been too long for me to remember if it does the same thing.
KitsuneYMG

1
Also, livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/… for actionscript. Basically, google "strict equality".
Chris

4

The == incurs a larger overhead of type conversion before comparison. === first checks the type, then proceeds without having to do any type conversion.



3

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


0

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


0

В php (c code) значением является «класс», такой как:

class value
{
    $int_;
    $float_;
    $string_;
    $array_;
    $object_;
}

Когда ваш сравнивают $a == $bи $aявляется intтипом, то будет что - то вроде:

if ($a->int_ == $b->int_ || $a->int_ == (int) $b->float_ || $a->int_ == (int) $b->string_ || ...)

но string '1'не будет приведен к ASCII-коду 49, это будет1 .

Когда вы сравниваете $a === $bи $aявляется intтип, будет , как коснуться:

if ($a->int_ == $b->int_)

-4

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

Процессор будет делать все, что ему говорят, за такт

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

Дополнение:

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

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

Фил


У вас есть только один оператор IF в вашей базе кода? Это странно, потому что в каждой кодовой базе, над которой я работал, у нас есть тысячи IF или сравнительных операторов, вызываемых везде.
Лев
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.