Przyspieszamy skrypty PHP (kilka prostych wskazówek)
Wykonanie przeciętnego skryptu napisanego w PHP trwa kilka milisekund i dla zwykłego użytkownika jest praktycznie niezauważalne. Jednak w wypadku popularnych witryn i dużych fragmentów kodu liczą się każda milisekunda i każdy kilobajt danych. Projektant aplikacji sieciowej nie może więc poprzestać jedynie na unikaniu w tworzonym kodzie najpoważniejszych błędów. Warto także już na początku swojej programistycznej edukacji zapoznać się z kilkoma praktycznymi wskazówkami, które pozwolą uczynić projektowane w przyszłości rozwiązania bardziej wydajnymi.
1. Zredukuj liczbę wywołań funkcji
Przyjrzyjmy się poniższemu fragmentowi kodu:
|
$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20); |
Funkcja sizeof() jest w tym wypadku wywoływana aż dwadzieścia jeden razy – całkowicie bez potrzeby. Wystarczyłoby, po jednokrotnym jej uruchomieniu, zapisać wielkość tablicy do zmiennej, a później po prostu wielokrotnie wykonać pętlę:
|
$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20); for($a = 0; $a < $size; $a++) { |
Aby sprawdzić, czy podana wskazówka faktycznie pozwala zredukować czas realizacji działania skryptu, wykonaliśmy praktyczną próbę: najpierw uruchomiliśmy pierwszy skrypt, korzystając z tablicy z dziesięcioma tysiącami elementów, a następnie drugą jego wersję – przy użyciu tej samej tablicy. W rezultacie czas wykonywania zmniejszył się o ponad 50% (z 0,0278 do 0,0128 sekundy).
2. Oszczędzaj pamięć
Unikajmy tworzenia tysięcy zmiennych tylko po to, aby przechować w nich tekst, który później wyświetlimy, korzystając z instrukcji echo. Zamiast poniższego kodu:
|
$string = 'Ala ma kota'; |
napiszmy po prostu:
|
echo ‘Ala ma kota’; |
Jeśli jednak musimy koniecznie przechować coś dużego w zmiennej, pamiętajmy, by ją później zlikwidować za pomocą polecenia unset($zmienna).
3. Co wybrać: str_replace() czy ereg_replace()? A może preg_replace()?
Gdy do wyszukiwania i zamiany fragmentów tekstu stosujemy wyrażenia regularne, musimy bez wątpienia wykorzystać jedną z funkcji: ereg_replace() lub preg_replace(). Kiedy jednak chcemy po prostu wyszukać w tekście dane słowo i zastąpić je innym, stosujmy raczej funkcję str_replace(), której wykonywanie trwa o ponad 60% krócej.
Przykład praktyczny? Proszę bardzo – dla każdej z funkcji wywołanej pięć milionów razy czas wykonania wynosił kolejno: ereg_replace() – 26,65647 sekund, preg_replace() – 25,18324 sekund, str_replace() – 10,26872 sekund.
4. Preinkrementacja jest (minimalnie) szybsza niż postinkrementacja
Podczas postinkrementacji tworzona jest zmienna tymczasowa, podczas preinkrementacji natomiast nic takiego się nie dzieje. Dlatego też kod postaci ++$num wykona się o ponad 20% szybciej niż kod $num++.
5. Czy dobrze jest korzystać z wyrażeń regularnych?
Niekiedy nie. Stosując funkcję ctype_digit($liczba), zamiast konstrukcji ereg('[0123456789]', $liczba) dla sprawdzenia, czy zmienna jest poprawną liczbą, zyskujemy 59% czasu wykonania skryptu. Aby tego dowieść, wykonaliśmy podobny kod milion razy. Efekt? Wynik dla funkcji ereg – 2,4 sekundy, dla funkcji ctype_digit – 0,99 sekundy.
6. Używaj time() zamiast date()
Sto tysięcy wywołań obu funkcji to odpowiednio 0,057 sekundy dla time() i 19,162 sekundy dla date(). Różnica rzuca się w oczy.
7. Instrukcja intval() czy int?
Wykonanie konwersji wartości na typ integer (liczba całkowita) za pomocą instrukcji $num = int '120'jest o połowę szybsze niż w wypadku $num = intval('120').
8. Kilka dobrych rad
Oprócz wymienionych powyżej wskazówek (wpływających na wydajność skryptu) są też takie, które co prawda jedynie minimalnie przyspieszą działanie aplikacji, niemniej korzystanie z nich może stać się dobrym nawykiem. Pamiętajmy więc, że:
-
funkcja explode() działa odrobinę szybciej niż funkcja split(),
-
funkcja echo jest nieco bardziej efektywne niż print,
-
porównania wykonywane za pomocą operatora === działają wydajniej od tych wykonanych przy użyciu ==,
-
pętla do{}while przewyższa pod tym względem najwolniejszą ze wszystkich instrukcję for(){}.
Podsumowanie
Musimy niestety ostudzić zapał tych, którzy po lekturze artykułu wezmą się za swój kod, zmieniając wszędzie preg_replace() na str_replace(), a wygodne pętle for(){} na mało intuicyjne do{}while. Prawdopodobnie nawet zastosowanie wszystkich wymienionych porad nie przyspieszy na tyle zwykłej, domowej strony, by stało się to zauważalne dla użytkownika. Jednak w przyszłości, gdy przyjdzie nam przygotowywać bardziej rozbudowane skrypty dla stron obsługujących dużą liczbę wywołań, ta wiedza może okazać się bardzo pomocna. Warto więc przyswoić ją sobie już teraz. Oczywiście zebrane w artykule wskazówki nie są uniwersalnym remedium na wszystkie bolączki niezoptymalizowanego kodu. Pamiętajmy o tym, że często wąskim gardłem witryny jest baza danych, a zapytania do niej kierowane mogą nas „kosztować” ponad 90% czasu wykonywania skryptu.
Popełnianym wielokrotnie błędem jest na przykład pobieranie z bazy wszystkich rekordów, by następnie wybrać zaledwie kilka z nich za pomocą pętli for(){} – podczas gdy już w zapytaniu można było przecież zażądać tylko tych paru konkretnych wyników. Warto więc pomyśleć o optymalizacji zapytań, ich cache'owaniu lub (gdy danych jest mało) zrezygnować całkowicie z bazy i przechowywać treści w plikach tekstowych. Stosowanie tych i podobnych „dobrych praktyk” pozwoli nam programować wydajne i elastyczne aplikacje sieciowe – zarówno dziś, jak i w najbliższej przyszłości.
Polecamy
Reklama
Komentarze
Aby dodać komentarz, musisz podać swój nick, treść komentarza oraz poprawnie przepisać oba słowa z obrazka
(słowa muszą być rozdzielone spacją).
W treści komentarza można używać języka formatowania BBcode.
Popularne
Pobierałeś pirackie pliki? Uważaj! Kontrole antypirackie w domach użytkowników to codzienność
33
Pobieraczek.pl pozwie internautów, którzy nie chcą płacić abonamentu
1455
Debata w sprawie ACTA: internauci spodziewali się chyba czegoś innego
14
Wynalazca WWW przed sądem: walczy tam o wolny dostęp do webowych technologii dla każdego
8
PHP 5.3.9 nie pozwoli hakerom zawiesić serwera. Pozwoli za to przejąć nad nim kontrolę
28
Programowanie w środowisku Android – wprowadzenie do projektowania aplikacji dla urządzeń mobilnych
15
Internet w EU bez Facebooka i Google? Firmy nie mają wyboru: albo się dostosują, albo…
10
MSWiA zamówiło narzędzia do „złamania” Tora i podsłuchiwania internautów. Czy złamało przy tym prawo?
89
[Aktualizacja] Facebook zablokował Demotywatory.pl. W czym zawiniły?
36
FBI zamknęło Megaupload. Anonimowi dali się sprowokować. Teraz ich akcja uzasadni potrzebę SOPA?
17
Pobieraczek.pl pozwie internautów, którzy nie chcą płacić abonamentu
1455
Programowanie w środowisku Android – wprowadzenie do projektowania aplikacji dla urządzeń mobilnych
15
„Donald matole, twój rząd dopadną kibole” – hakerska elita przyłącza się do walki z ACTA
23
Klamka jeszcze nie zapadła. Minister prosi Donalda Tuska, by wstrzymał się z podpisywaniem ACTA
24
Społeczność
tobas ClickShop bardzo wolno działa!!!
Nie dajcie się nabrać na wygląd i...
blackbear @WebDev, widzę że muszę Ci rozjaśnić we łbie. Czytaj więc i nie pisz...
Jay Brak obsługi aplikacji x86/x64 ze zwykłych desktopów to kręcenie na siebie...
WebDev @slawek22
Tak jak ze wszystkim tak i z prawem własności można przesadzić...
Nie dla ACTA. Nie dla INDECT. Nie dla europejskiego superpaństwa policyjnego. "rejestruje dane statyczne tj. wygląd podpisu, jak i dynamiczne: czas...
slawek22 @WebDev:
Te korporacje i "twórcy" starej daty których tak bronisz nie...
darekp @eimi, a co za różnica między zdobytym pieniędzmi a nie? Spróbuj zdobyć...
- gardius: Dobra hurtownia sportowa (1)
- gardius: Tanie książki gdzie warto kupować? (1)
- Najdmen.pl: PROMOCJA, 500 DOMEN .EU ZA 1 PLN NETTO ! (1)
- VMLine: [Oferta] Serwery VPS Xen-HVM/OpenVZ z darmową administracją (2)
- Marek: Generowanie PDFa (2)
- Marek: problem z menu (2)
- Marek: Własne checkboxy w HTML,CSS (1)
Polecane książki
Praca
Czytaj Webhosting
Chcesz być na bieżąco z naszymi informacjami? Zapisz się na Newsletter.
Zarejestruj domenę
Sprawdź dostępność swojej domeny:
| .pl: | 0 zł | .com: | 19.90 zł | |
|---|---|---|---|---|
| .com.pl: | 0 zł | .eu: | 19.90 zł |









#1 miklosz® 2008-09-30 10:34:36 0
None
#2 dAREuS® 2008-09-30 10:49:43 0
None
#3 tcpl 2008-09-30 10:58:06 0
None
#4 mario® 2008-09-30 11:35:47 0
None
#5 eRIZ® 2008-09-30 18:34:17 0
None
#6 Integral® 2008-09-30 21:41:02 0
None
#7 tomal 2008-10-01 21:33:10 0
None
#8 mishell 2008-10-10 21:15:09 0
None
#9 cbagov 2008-10-26 15:43:37 0
None
#10 ayeo 2008-11-09 17:56:59 0
None
#11 Piotr Jankowski 2008-11-09 19:04:39 0
None
#12 Kubi 2008-11-09 19:38:22 0
None
#13 IvanBarazniew 2008-11-09 21:38:50 0
None
#14 Piotr 2008-11-09 22:26:07 0
None
#15 Daniel 2008-11-10 08:58:29 0
None
#16 googlebot 2009-05-01 19:57:27 0
IP: 79.191.73.[...] Opera/9.64 (Windows NT 5.1; U; pl) Presto/2.1.1
#17 darky 2010-06-25 15:36:31 0
IP: 89.229.35.[...] Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.5.24 Version/10.53