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.

Dodaj komentarz

13 odpowiedzi dla tego wpisu

  1. kixner napisał:

    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.

  2. MariuszT napisał:

    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 ;)

  3. kixner napisał:

    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.

  4. Anonim napisał:

    Czyżby ?
    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 :) się zmienia np. losowo

  5. Mateusz Żeromski napisał:

    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ć.

  6. MariuszT napisał:

    @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.

  7. Mateusz Żeromski napisał:

    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

  8. MariuszT napisał:

    Postaram się w przyszłości zaznaczać na początku wpisu, że to ciekawostka, jakaś błaha acz dla wielu zaskakująca własność :)

  9. strony internetowe napisał:

    Optymalizacja to bardzo wazny aspekt, dzieki za informacje, ksiazki totalnie pomijaja te zagadnienia.

  10. MariuszT napisał:

    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 :P

    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.

  11. MISZCZ napisał:

    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.

  12. MariuszT napisał:

    Ł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.

  13. Raziel napisał:

    Nie kompilatorze a parserze ;p echh Co nie znaczy ze mamy uczyc przedszkole programowac w PHP bez jaj prosze.

Odpowiedz



Podobne wpisy: