@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.
Во-первых, === проверяет, являются ли два аргумента одного типа поэтому число 1 и строка «1» завершаются неудачно при проверке типа перед тем, как будут выполнены какие-либо сравнения. С другой стороны, == сначала не проверяет тип, а затем преобразует оба аргумента в один и тот же тип, а затем выполняет сравнение.
Следовательно, === быстрее проверяет состояние ошибки
Я предполагаю, что ==сначала также проверяется тип, чтобы узнать, нужно ли выполнять какое-либо преобразование типа. Тот факт, что ===на следующем шаге не выполняется никакого преобразования, делает его более быстрым.
deceze
25
Есть две вещи для рассмотрения:
Если типы операндов различны, то ==и ===дают разные результаты . В этом случае скорость операторов не имеет значения; важно то, какой из них дает желаемый результат.
Если типы операндов одинаковы, вы можете использовать один из них ==или ===оба будут давать одинаковые результаты . В этом случае скорость обоих операторов практически одинакова. Это связано с тем, что ни один из операторов не выполняет преобразование типов.
Я сравнил скорость:
$a == $b против $a === $b
где $aи $bбыли случайные целые числа [1, 100]
две переменные были сгенерированы и сравнены миллион раз
Интересно, что произойдет, если вы сделаете несколько миллиардов итераций на машине, которая больше ничего не делает, и просто выведите среднее значение. Похоже, здесь довольно много шума. ;)
Гунг Фу
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.
The == incurs a larger overhead of type conversion before comparison. === first checks the type, then proceeds without having to do any type conversion.
Я сомневаюсь, что разница в скорости очень большая, хотя. При нормальных обстоятельствах вы должны использовать тот оператор, который имеет больше смысла.
В заключение === быстрее, потому что не преобразует тип данных, чтобы увидеть, если две переменные имеют одинаковое значение, но когда вам нужно увидеть, если две переменные имеют одинаковое значение, вы будете использовать ==, если не важно, какой тип являются переменными или === если важен также тип переменных.
Быстрее следует измерять не только во время непосредственного выполнения (прямые тесты производительности в этом случае практически ничтожны). Тем не менее, мне нужно будет увидеть тест, включающий в себя итерацию или рекурсию, чтобы действительно увидеть, есть ли существенная кумулятивная разница (при использовании в реалистическом контексте). Время тестирования и отладки, которое вы сэкономите при работе с крайними случаями, также должно быть значимым для вас.
Если результаты теста верны, то это должно быть проблемой компилятора,
Процессор будет делать все, что ему говорят, за такт
Если будет меньше, то будет быстрее
Дополнение:
Ну, на самом деле, если компилятор уже создал множество машинного кода для обработки, то, если он уже добавил миллиарды вещей, чтобы справиться с тем, какой тип данных требует сравнения, то удаление одного «второстепенного» IF не изменит скорости сильно вообще.
Если кто-то все еще читает это, то мне интересно больше обсуждать.
У вас есть только один оператор IF в вашей базе кода? Это странно, потому что в каждой кодовой базе, над которой я работал, у нас есть тысячи IF или сравнительных операторов, вызываемых везде.
=== vs ==
, но в JAVASCRIPT, можете прочитать здесь: stackoverflow.com/questions/359494/…Ответы:
Поскольку оператор равенства
==
принуждает или преобразует тип данных временно, чтобы увидеть, равен ли он другому операнду, в то===
время как (оператору идентичности) не требуется выполнять какое-либо преобразование, и поэтому выполняется меньше работы, что делает его более быстрым.источник
===
не выполняет приведение типов, поэтому0 == '0'
оцениваетtrue
, но0 === '0'
- вfalse
.источник
Во-первых, === проверяет, являются ли два аргумента одного типа поэтому число 1 и строка «1» завершаются неудачно при проверке типа перед тем, как будут выполнены какие-либо сравнения. С другой стороны, == сначала не проверяет тип, а затем преобразует оба аргумента в один и тот же тип, а затем выполняет сравнение.
Следовательно, === быстрее проверяет состояние ошибки
источник
==
сначала также проверяется тип, чтобы узнать, нужно ли выполнять какое-либо преобразование типа. Тот факт, что===
на следующем шаге не выполняется никакого преобразования, делает его более быстрым.Есть две вещи для рассмотрения:
Если типы операндов различны, то
==
и===
дают разные результаты . В этом случае скорость операторов не имеет значения; важно то, какой из них дает желаемый результат.Если типы операндов одинаковы, вы можете использовать один из них
==
или===
оба будут давать одинаковые результаты . В этом случае скорость обоих операторов практически одинакова. Это связано с тем, что ни один из операторов не выполняет преобразование типов.Я сравнил скорость:
$a == $b
против$a === $b
$a
и$b
были случайные целые числа [1, 100]И вот результаты:
Вы можете видеть, что скорость почти идентична.
источник
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.
источник
The == incurs a larger overhead of type conversion before comparison. === first checks the type, then proceeds without having to do any type conversion.
источник
Because
===
doesn't need to coerce the operands to be of the same type before comparing them.Я сомневаюсь, что разница в скорости очень большая, хотя. При нормальных обстоятельствах вы должны использовать тот оператор, который имеет больше смысла.
источник
В заключение === быстрее, потому что не преобразует тип данных, чтобы увидеть, если две переменные имеют одинаковое значение, но когда вам нужно увидеть, если две переменные имеют одинаковое значение, вы будете использовать ==, если не важно, какой тип являются переменными или === если важен также тип переменных.
источник
Быстрее следует измерять не только во время непосредственного выполнения (прямые тесты производительности в этом случае практически ничтожны). Тем не менее, мне нужно будет увидеть тест, включающий в себя итерацию или рекурсию, чтобы действительно увидеть, есть ли существенная кумулятивная разница (при использовании в реалистическом контексте). Время тестирования и отладки, которое вы сэкономите при работе с крайними случаями, также должно быть значимым для вас.
источник
В php (c code) значением является «класс», такой как:
Когда ваш сравнивают
$a == $b
и$a
являетсяint
типом, то будет что - то вроде:но
string
'1'
не будет приведен к ASCII-коду49
, это будет1
.Когда вы сравниваете
$a === $b
и$a
являетсяint
тип, будет , как коснуться:источник
Если результаты теста верны, то это должно быть проблемой компилятора,
Процессор будет делать все, что ему говорят, за такт
Если будет меньше, то будет быстрее
Дополнение:
Ну, на самом деле, если компилятор уже создал множество машинного кода для обработки, то, если он уже добавил миллиарды вещей, чтобы справиться с тем, какой тип данных требует сравнения, то удаление одного «второстепенного» IF не изменит скорости сильно вообще.
Если кто-то все еще читает это, то мне интересно больше обсуждать.
Фил
источник