Optymalizacja PHP: if/elseif/else szybsze od switch/case
06 maja 2009
W każdym kursie, w każdej książce o PHP najpierw opisywana jest funkcjonalność if/elseif/else a potem pokazana jest alternatywa switch/case z komentarzem, że jeżeli mamy kilka następujących po sobie warunków to najlepiej skorzystać właśnie ze switch/case.
A ja na to: gówno prawda!
Zaletą konstrukcji switch/case w PHP jest… ładny wygląd
Taki zapis wygląda na bardziej uporządkowany, w kodzie jest mniejszy zamęt. Niestety opłacamy to wydajnością…
No dobrze dobrze, nie będę przesadzał
Tak naprawdę to różnice są niewielkie. Przy tysiącu prób warunki if/elseif wykonały się w 2 milisekundy a switch/case w 3 milisekundy. Co ciekawe, użycie w if === zamiast == przyspiesza wykonanie o 4%.
Nie namawiam do porzucenia switch/case. Proszę traktować ten wpis jako ciekawostkę na błahy temat
Taka odskocznia od poważnych problemów.
Blog przede wszystkim o Internecie i mojej pasji jaką jest tworzenie stron www. Ale nie ograniczam się do jednej tematyki, piszę o wszystkim o czym mam ochotę :-)
kixner napisał: 08.05.09 o godzinie 14:17
Kazde uzycie === zamiast == w if tak znaczaco przyspiesza dzialanie skryptu?
A 2ms przy tysiacu if a case, to raczej maly zysk biorac pod uwage duzo wieksze zamieszanie w kodzie.
MariuszT napisał: 08.05.09 o godzinie 16:32
Test który przeglądałem (nie ja byłem jego autorem) wykazał, że gdy zamieniliśmy == na === w warunku IF to skrypt przyspieszył o 4%.
Wiem, że to co opisałem to malutkie ulepszenia i nie wpływają znacząco na szybkość działania skryptów. Ale o optymalizacji PHP napisano już bardzo dużo i nietrudno znaleźć na ten temat wskazówki więc pomyślałem, że fajnie byłoby opisać mniej znane rzeczy, takie ciekawostki, które większość pomija
kixner napisał: 08.05.09 o godzinie 17:17
Bardzo dobrze, ze wypisujesz takie rzeczy, bo wiekszosc kursow pomija zagadnienia optymalizacji. A po za tym, ciezko znalezc zbior takich porad w jednym miejscu, wiec jak najbardziej jestem za tym, zebys publikowal tego jak najwiecej.
Anonim napisał: 28.05.09 o godzinie 13:26
Czyżby ?
się zmienia np. losowo
Zrób sobie :
if ($a=1)
{
.
}
if ($a=2)
{
.
}
// i tak do powiedzmy 30
to w pętli , a potem napisz w tej samej pętli
switch ($a)
case 1
case 2
// też do 30
i zmierz czas wykonania przy wielu powtórzeniach ale niech $a (częściej będzie małe
Mateusz Żeromski napisał: 30.05.09 o godzinie 22:00
Tak sobie to przeczytełem i widzę przerost formy nad treścią.
O przyspieszeniu mozemy mówić w przypadku zmiany o rząd wielkości czyli 0.03 nie rózni się od 0,04 ale rózni się od 0,4. A ty piszesz o znacznym przyspieszeniu kodu. Napisz coś ciekawego na temat optymalizacji która zmniejszy rząd wielkości czasu wykonywania, a nie jakieś milisekundy.
Także to co napisaleś nie jest optymalizacją tylko ‘optymalizacją’
Switch/Case – są sytuacje kiedy wypada tego użyć dla przejrzystości kodu i nalezy tego uzyć – po to zostało wymyślone, zgadzam się z @ANONIM
Może to i ciekawostka, ten swich/if, ale to jest tak samo jak prędkością dzialania for, foreach, while itp – w praktycznym uzyciu nie ma znaczenia – można tylko akademicko rozważać która pętla wykonuje się najszybciej i dlatego jej warto używać.
MariuszT napisał: 01.06.09 o godzinie 13:33
@Anonim – testowałem to, u mnie wyniki były zgodne z tym co napisałem. Być może w grę wchodzi jeszcze używany system, wersja PHP itp.
@Mateusz – wyraźnie zaznaczyłem, że taka optymalizacja to przyspieszenie wykonywania się skryptów o ułamek promila. W internecie jest mnóstwo porad na temat optymalizacji PHP, nie chcę tworzyć tysięcznego artykułu o różnicach między pojedynczymi i podwójnymi cudzysłowami, po raz tysięczny przypominać, że operację zliczania elementów w tablicy należy wykonać przed pętlą for a nie w niej itd. Ja chcę pisać o ciekawostkach. Może mało istotnych ale często zaskakujących.
Mateusz Żeromski napisał: 01.06.09 o godzinie 14:22
Cześć
Nie wiedziałem, że takie są Twoje intencje, ja to zrozumiałem jako rekomendację używania ‘a’ zamiast ‘b’
Wiem, że nie mogę niczego narzucić, ale może byś takie rzeczy oznaczał jako „Ciekawostka” – wtedy mógłby powstać dość ciekawy dział.
Jako następną ciekawostkę poproszę o szybkość pętli
Pozdrawiam
MariuszT napisał: 01.06.09 o godzinie 15:27
Postaram się w przyszłości zaznaczać na początku wpisu, że to ciekawostka, jakaś błaha acz dla wielu zaskakująca własność
strony internetowe napisał: 08.09.09 o godzinie 11:10
Optymalizacja to bardzo wazny aspekt, dzieki za informacje, ksiazki totalnie pomijaja te zagadnienia.
MariuszT napisał: 21.10.09 o godzinie 11:25
Dopisuję komentarz bo właśnie rozmawiam z kimś na gg kto polecił mi wyjaśnić różnicę między === a ==
Sam nie może dodać bo mu coś nie działa
Prawdę powiedziawszy to nie pomyślałem, że ktoś po powyższym artykule może zacząć wpisywać w warunkach if wszędzie === bez wiedzy jaka jest różnica z == ale skoro ktoś na to zwraca uwagę to znaczy, że jest taka możliwość
No więc drogie dzieci hehe
Użycie == porównuje tylko wartości, nie zwraca uwagi na typ danych. Z tego powodu jeżeli mam dwie zmienne i jedna jest stringiem równym „0″ a druga liczbą równą 0 to warunek if porównania takich zmiennych będzie prawdziwy.
Trzy znaki równania === porównują dodatkowo typ danych. Czyli obie zmienne muszą być identyczne aby warunek był prawdziwy. W naszym przykładzie obie musiałyby być równe „0″ lub 0.
MISZCZ napisał: 20.06.10 o godzinie 15:29
MARIUSZT, napisałeś, że == nie zwraca uwagi na typ danych co jest totalną bzdurą. Sęk w tym, że dwa znaki równość konwertują wcześniej obie zmienne na ten sam typ tak aby można było je ze sobą porównać. === pomija konwertowanie typów i dlatego jest szybsze.
MariuszT napisał: 20.06.10 o godzinie 16:03
Łapiesz mnie za słówka. Oczywiście masz rację z tą konwersją jednak Ty tłumaczysz proces jaki zachodzi w kompilatorze PHP a ja opisałem w uproszczeniu jakie ma to konsekwencje dla programisty. To oczywiste, że musi następować proces konwersji aby w ogóle można było coś ze sobą porównać. Z tego również powodu === ma przewagę wydajnościową nad == gdyż nie zachodzi konwersja.
Raziel napisał: 21.12.10 o godzinie 21:54
Nie kompilatorze a parserze ;p echh Co nie znaczy ze mamy uczyc przedszkole programowac w PHP bez jaj prosze.