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.
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
Nazwa padła ofiarą szantażystów, inni polscy hosterzy też zagrożeni?
22
Darmowy Internet od Aero2. Jak go zdobyć i jakie są prawdziwe koszta? Instrukcja krok po kroku
11
Programowanie w środowisku Android – wprowadzenie do projektowania aplikacji dla urządzeń mobilnych
17
Premiera Diablo 3 wzbudziła dyskusję na temat gier, które zawsze chcą być online
19
Nowy problem z Windows 8: bootuje się za szybko
10
Amerykańscy rodzice straszeni „e-narkotykami” dostępnymi w Sieci
21
Anonymous upubliczniają 1,7 GB danych wykradzionych Departamentowi Sprawiedliwości USA
12
Blueseed: libertariańska sztuczna wyspa przyciągnęła już ponad sto startupów z całego świata
8
Rewolucja w Firefoksie, nowa łatka czterokrotnie ograniczyła zużycie pamięci
20
Darmowy Internet od Aero2. Jak go zdobyć i jakie są prawdziwe koszta? Instrukcja krok po kroku
11
CVDazzle: makijaż jest w stanie pokonać automatyczne systemy ulicznego monitoringu
3
Programowanie w środowisku Android – wprowadzenie do projektowania aplikacji dla urządzeń mobilnych
17
Ubuntu 12.04 LTS już dostępny: stabilna dystrybucja na następne pięć lat?
28
Zostań webmasterem polskiego rządu, zarobisz na komfortowe życie dla siebie i swojej rodziny
33
Społeczność
Daresh A ja na pulpicie nie mam żadnych ikon i nie potrzebuję takich narzędzi :)
buahahaha @xyz: jak będzie wybór między MS ograniczającym wybór a Apple...
xyz @bartez® : Uważasz, że Apple nie ogranicza programistów? buahahaha
anga star za droga ludzie wy myślicie!?Jestem 4 klasistką rodzice się nigdy nie...
Jan Zwyczajnych filmów tak kręcić się nie da co najwyżej krótkie scenki jak w...
piotrek____ @asdfgh - yup, też tak sądzę.
Tak jak wtedy ten przeciek o żołnierzu...
gonzales Javowcy pozdrawiają dotnetowców xD
- Najdmen.pl: Konta www z wyłączonym licznikiem transferu od IONIC.pl (1)
- 2BE.PL: [Oferta] Promocja jak złoto w 2BE.PL (1)
- 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)
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