Чому === швидше, ніж == у PHP?


168

Чому ===швидше, ніж ==у PHP?


40
Це швидше, але чи істотно швидше?
Пісквор вийшов з будівлі

19
Будь ласка, не читайте про те, що швидше в PHP. Прочитайте, як отримати цікаві дані в одному SQL-запиті, не зловживаючи JOIN.
Каміль Шот

15
Кому це може бути цікаво в цій же темі === vs ==, але в JAVASCRIPT, можна прочитати тут: stackoverflow.com/questions/359494 / ...
Marco DeMaio

5
@Piskvor, це не питання
Pacerier

6
@Pacerier: Справедливий момент - тому я лише прокоментував це. Він не відповідає на питання, але дає перспективу на це.
Пісквор вийшов з будівлі

Відповіді:


200

Оскільки оператор рівності ==примушує або перетворює, тип даних тимчасово перевіряє, чи є він рівним іншому операнду, тоді як ===(оператору ідентичності) не потрібно робити якісь перетворення, і, таким чином, проводиться менше роботи, що робить його швидшим.


Я думаю, ваша думка суперечить тому, що говорить Посібник PHP. Вони кажуть, що $ a == $ b - ІСТИНА, якщо $ a дорівнює $ b, де $ a === $ b - ІСТИНА, якщо $ a дорівнює $ b, і вони того ж типу.
Бахтіор

92
Як тоді це суперечить?
meder omuraliev

2
Я вважаю, що насправді два операнди вказують на одну і ту ж область пам’яті для складних типів, але відповідь Медера включає
Базовий

1
Це має сенс (як це в JS), але було б добре, якщо хтось додасть також посилання на деякі реальні прості тести на працездатність.
Марко Демайо

4
phpbench.com має вказівку на різницю продуктивності між == та === у розділі "Структури управління".
ekillaby

54

===не виконує набір типів, тому 0 == '0'оцінює до true, але 0 === '0'- до false.


25

По-перше, === перевіряє, чи є два аргументи одного типу - значить, число 1 та рядок "1" не спрацьовують під час перевірки типу, перш ніж проводиться порівняння. З іншого боку, == не перевіряє тип спочатку і продовжує і перетворює обидва аргументи в один і той же тип, а потім проводить порівняння.

Тому === швидше перевіряє стан відмови


8
Я думаю, що ==також перевіряє тип спочатку, щоб побачити, чи потрібно проводити перетворення типів. Факт, ===який не здійснює перетворення на наступному кроці, - це робить його швидшим.
деге

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 Я так не думаю, оскільки 10 не є емпіричним дослідженням. Основна причина, по якій немає різниці, полягає в тому, що компілятор PHP, ймовірно, оптимізує код. Слід використовувати ===, якщо не потрібне перетворення типу, це допоможе зменшити смислові помилки (навіть якщо це один раз у вашому житті). Він також допомагає наступній особі, яка читає код, які правила виконуються. Ви пишете один раз, це читається кілька сотень разів, якщо це може допомогти усунути сумніви однієї людини, це вже вдалося. Також немає тесту пам’яті, якщо емпіричний, оскільки клонували до одного типу. Ресурсів більше, ніж лише часу.
Марко

@Marco, коли я кажу "емпіричне дослідження", я маю на увазі, що це ґрунтується на досвіді, наприклад: запуск коду замість того, щоб робити аргумент, використовуючи лише розум (або те, що на увазі), без експерименту, щоб його підкріпити. Значення Salman A напрошують === однаково іноді трохи швидше, а іноді трохи повільніше. Це означає "Чому в PHP === швидше, ніж ==?" ставить питання: "Як ти знаєш, що === швидше, ніж =="? Оптимізація компілятора - це пояснення, а не те, що швидше чи повільніше, і я не сказав, що слід використовувати.
Педро Амарал Куто

7

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


9
У Javascript є оператор ===.
Френк Ширар

Я впевнений, що ти можеш зробити === спільним лісом та схемою.
pupeno

Javascript - не в 3-х визначеннях язика, які я перевірив;) І у Lisp і Scheme багато речей, але навряд чи поширені;)
TomTom

1
ruby має ===. Мені вже занадто довго запам'ятовувалося, чи робить це те ж саме.
KitsuneYMG

1
Також livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/… для actioncript . В основному, Google "сувора рівність".
Кріс

4

Перш ніж порівняння, == має більший накладний перехід типу. === спочатку перевіряє тип, потім продовжує, не здійснюючи перетворення типів.



3

На закінчення === швидше, тому що не перетворює тип даних, щоб побачити, чи мають дві змінні однакове значення, але коли вам потрібно побачити, чи мають дві змінні однакове значення, ви будете використовувати ==, якщо не значите, який тип є змінними , або ===, якщо важливий також тип змінних.


0

Швидше не слід вимірювати просто час прямого виконання (прямі тести на працездатність майже незначні в цьому випадку). З огляду на це, мені потрібно пройти тест, що включає ітерацію чи рекурсію, щоб реально побачити, чи є значна, сукупна різниця (при використанні в реалістичному контексті). Час тестування та налагодження, який ви заощадите під час розгляду крайових справ, також має бути важливим для вас


0

У php (c коді) значення - це "клас" типу:

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? Це дивно, тому що в кожній базі коду, над якою я працював, ми маємо тисячі ІЧ або порівняльних тверджень, які називаються скрізь.
Лев
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.