Dlaczego = = = jest szybszy niż = = w PHP?

Dlaczego === jest szybszy niż == w PHP?

Author: Rob W, 2010-03-08

10 answers

Ponieważ operator równości == wymusza lub konwertuje typ danych tymczasowo, aby sprawdzić, czy jest równy drugiemu operandowi, podczas gdy === (operator tożsamości)nie musi wykonywać żadnej konwersji, a tym samym mniej pracy jest wykonywana, co przyspiesza.

 182
Author: meder omuraliev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-08 13:25:15

=== nie wykonuje typecastingu, więc 0 == '0' ocenia na true, ale 0 === '0' - na false.

 50
Author: raveren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-08 13:17:38

Najpierw, = = = sprawdza, czy dwa argumenty są tym samym typem - Tak więc liczba 1 i łańcuch " 1 " nie sprawdzają się przy sprawdzaniu typu przed dokonaniem jakichkolwiek porównań. Z drugiej strony, = = nie sprawdza najpierw typu, a następnie konwertuje oba argumenty na ten sam typ, a następnie dokonuje porównania.

Dlatego = = = jest szybszy przy sprawdzaniu stanu fail

 24
Author: iblamefish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-08 13:16:46

Są dwie rzeczy do rozważenia:

  1. Jeśli typy operandów są różne, to == i === dają różne wyniki. W takim przypadku szybkość operatorów nie ma znaczenia; ważne jest, który z nich daje pożądany efekt.

  2. Jeśli typy operandów są takie same, możesz użyć == lub ===, ponieważ oba wywołają te same wyniki. W tym przypadku prędkość obu operatorów jest prawie identyczna. Dzieje się tak dlatego, że żaden typ konwersja jest wykonywana przez oba operatory.

Porównałem prędkość:

  • $a == $b vs $a === $b
  • gdzie $a i $b były przypadkowymi liczbami całkowitymi [1, 100]
  • dwie zmienne zostały wygenerowane i porównane milion razy
  • testy przeprowadzono 10 razy

A oto wyniki:

 $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

Widać, że prędkość jest prawie identyczna.

 19
Author: Salman A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-19 10:12:31

Naprawdę Nie wiem, czy jest to znacznie szybsze, ale = = = w większości języków jest bezpośrednim porównaniem typów, podczas gdy = = spróbuje wykonać przymus typu, jeśli jest to konieczne/możliwe, aby uzyskać dopasowanie.

 7
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-08 13:16:31

= = powoduje większą narzut konwersji typu przed porównaniem. = = = najpierw sprawdza typ, a następnie kontynuuje bez konieczności wykonywania jakiejkolwiek konwersji typu.

 4
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-08 13:18:18

Ponieważ === nie musi zmuszać operandów do tego samego typu przed ich porównaniem.

Wątpię jednak, by różnica w prędkości była bardzo duża. W normalnych warunkach należy używać operatora, który ma większy sens.
 4
Author: John Carter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:08

Podsumowując = = = jest szybszy, ponieważ nie konwertuje typu danych, aby sprawdzić, czy dwie zmienne mają tę samą wartość, ale gdy trzeba sprawdzić, czy dwie zmienne mają tę samą wartość, użyjesz = = jeśli nie ma znaczenia, jakiego typu są zmienne, lub = = = jeśli jest ważny również typ zmiennych.

 2
Author: D.Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-09 20:03:34

szybsze nie powinny być mierzone tylko w bezpośrednim czasie wykonania(bezpośrednie testy wydajności są w tym przypadku prawie znikome). To powiedziawszy, musiałbym zobaczyć test obejmujący iterację lub rekursję, aby naprawdę sprawdzić, czy istnieje znacząca, kumulacyjna różnica (gdy jest używana w realistycznym kontekście). Czas testowania i debugowania, który zaoszczędzisz, gdy zajmujesz się przypadkami brzegowymi, powinien być dla ciebie ważny, również

 0
Author: Anthony Rutledge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 15:20:22

Jeśli wyniki testów są poprawne, to musi to być problem kompilatora,

Procesor zrobi wszystko, co mu się każe w cyklu zegara

Jeśli ma mniej do zrobienia to będzie szybciej

Dodanie:

Ah no wlasciwie jesli kompilator juz stworzyl mnostwo kodu maszynowego do przetworzenia, To jesli juz dodal miliardy rzeczy, aby poradzic sobie z tym, jakiego typu danych trzeba porównac, to usuniecie jednego "drobnego" jesli nie zmieni znacznie szybkosci na wszystkie.

Jeśli ktoś jeszcze to czyta to jestem ciekawy w dalszej dyskusji.

Phil

 -2
Author: Phil Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-07 22:00:06