151

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

+35

Jest szybszy, ale czy * znacznie * szybciej? – Piskvor

+18

Proszę nie czytać o tym, co jest szybciej w php. Przeczytaj, jak uzyskać interesujące dane w pojedynczej kwerendzie SQL bez nadużywania JOIN. –

+15

Do kogo może być zainteresowany tym samym przedmiotem '=== vs ==', ale w JAVASCRIPT, można przeczytać tutaj: http://stackoverflow.com/questions/359494/javascript-vs-does-it-matter- which-equal-operator-i-use –

Odpowiedz

173

ponieważ operator równości == wymusza lub przekształca dane wpisać chwilowo, aby zobaczyć, czy jest równa drugiej argumentu natomiast === (operator tożsamości) nie musi zrobić każdy konwersji w ogóle, a tym samym mniej praca jest wykonywana, co czyni go szybciej.

+0

Myślę, że twoja opinia jest sprzeczna z tym, co mówi Podręcznik PHP. Mówią, że $ a == $ b ma wartość PRAWDA, jeśli $ a jest równe $ b, gdzie $ a === $ b ma wartość PRAWDA, jeśli $ a jest równe $ b, i są tego samego typu. – Bakhtiyor

+81

W jaki sposób jest to przeciwne? –

+2

Wierzę, że tak naprawdę to 2 operandy wskazują ten sam obszar pamięci dla typów złożonych, ale odpowiedź meduzy obejmuje to, że – Basic

7

Nie wiem, czy jest znacznie szybszy, ale === w większości języków jest bezpośrednim porównaniem typów, podczas gdy == spróbuje zastosować przymus w razie potrzeby/możliwe, aby uzyskać dopasowanie.

+9

Javascript ma operatora ===. –

+0

Jestem pewien, że możesz zrobić === w powszechnym seplenie i schemacie. – Pablo

+0

JavaScript - nie w 3 definicjach langauge, które sprawdziłem;) A Lisp i Scheme są wieloma rzeczami, ale rzadko spotykane;) – TomTom

22

Najpierw, === sprawdza, czy oba argumenty są takie same: typ - więc liczba 1 i ciąg "1" kończą się niepowodzeniem na sprawdzeniu typu, zanim zostaną faktycznie wykonane porównania. Z drugiej strony, == nie sprawdza najpierw typu i kontynuuje i konwertuje oba argumenty na ten sam typ, a następnie dokonuje porównania.

Dlatego === jest szybsze na sprawdzenie fail warunek

+6

Domyślam się, że '==' również sprawdza najpierw typ, aby zobaczyć, czy należy dokonać jakiejkolwiek konwersji typu.Fakt, że '===' nie wykonuje żadnej konwersji w następnym kroku, powoduje, że jest on szybszy. – deceze

49

=== nie wykonuje rzutowania typów, więc 0 == '0' ocenia się true, ale 0 === '0' - do false.

4

== Wiąże się większy narzut konwersji typu przed porównaniem. === najpierw sprawdza typ, a następnie kontynuuje bez konieczności jakiejkolwiek konwersji typu.

2

Podsumowując === jest szybciej, ponieważ nie konwertuje typ danych, aby zobaczyć czy dwie zmienne mają taką samą wartość, ale kiedy trzeba sprawdzić, czy dwie zmienne mają taką samą wartość, która będzie używana == jeśli doesen't Mather jaki typ są zmienne, lub === jeśli jest ważny również typ zmiennych.

12

Są dwie rzeczy do rozważenia:

  1. Jeśli operand są różne typy następnie == i === produkować różne wyniki. W takim przypadku prędkość operatorów nie ma znaczenia; ważne jest, który z nich przynosi pożądany rezultat.

  2. Jeśli typy argumentów operacji są takie same, a następnie można użyć == lub === jak obie będą produkować same wyniki. W takim przypadku prędkość obu operatorów jest prawie identyczna. Wynika to z faktu, że żadna z operatorów nie wykonuje żadnej konwersji.

I w porównaniu z szybkością:

  • $a == $b vs $a === $b
  • gdzie $a i $b były przypadkowe liczby całkowite [1 100]
  • obie zmienne i porównuje 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 niemal identyczny.

+9

Zastanawiam się, co się stanie, jeśli zrobisz kilka miliardów iteracji na komputerze, który nie robi nic innego i po prostu wyprowadza średnią. wygląda na to, że jest tu dość dużo hałasu. ;) –

+1

Doszedłem do tego samego wniosku: nie ma żadnej różnicy, jeśli operandy są znane z tego samego typu. Inne scenariusze nie powodują. Niemal wszystkie inne odpowiedzi są po prostu złe. –

-2

Jeśli wyniki badań są prawidłowe, to musi to być problem kompilator,

Procesor będzie robić, co każe mu się zrobić na cykl zegara

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

Dodatek:

Ah dobrze faktycznie jeśli kompilator stworzył już mnóstwo kodu maszynowego do przetworzenia, a następnie, jeśli to już dodany zillions rzeczy, aby poradzić sobie z tym, co typ danych wymaga porównywania, następnie Remo val jednego "małego" IF nie zmieni wcale prędkości.

Jeśli ktoś nadal czyta to, to jestem interesujący w dalszej dyskusji.

Phil

Powiązane problemy