Podstawy optymalizacji skryptów PHP/ Szybkość wykonania skryptu

W tym tutorialu pokażę kilka prostych chwytów pozwalających na testowanie szybkości wykonywania skryptów oraz na prawdę podstawowe kwestie optymalizacyjne. Postaram się także przedstawić pewien sposób myślenia przy pisaniu oraz testowaniu skryptów.

Jeszcze słowem wstępu. Żeby napisać ten tutek wpadłem w czasie testowania i optymalizacji małego skryptu. Pojedynczy, typowy strukturalny plik php do obsługi wyświetlania plików. Z założenia miał być szybki, bez dołączania oddzielnych plików. Tak było z założenia. A wyszło że plik był pisany dawno oraz na szybko. No a jak wiadomo, gdzie się człowiek śpieszy, tam się diabeł cieszy.  Zauważyłem kilka rzeczy które trzeba było poprawić. Oraz coś co poprawić było można. Podkreślam także że większość rzeczy tu opisanych to nie są jakieś niewiadome cuda. Wszystkie informacje są w internecie, lecz nie zawsze kładziony jest na nie taki nacisk.

Wpierw zacznijmy od tego sposobu myślenia przy pisaniu kodu. Mam dwie praktycznie identycznie działające funkcje i nie wiemy jak dobrze zostały zaimplementowane przez developerów PHP. Dla przykładu :

1
2
3
mktime()
 
time()

Obydwie funkcje, bez parametrów, jako wynik dają czas w unixtime. Potrzebuję tego unixtime, lecz nie wiem która funkcja jest szybsza. Więc przygotowuję skrypt który pozwoli mi przetestować szybkość wykonywania skryptów. Kod wygląda następująco :

1
2
3
4
5
6
7
8
9
$start = microtime(1);
for($i=0;$i<=1000;$i++){
//Tutaj kod który ma się sprawdzać
 
//Koniec
}
$koniec = microtime(1);
$dane = 'Skrypt wykonał się w : '.($koniec-$start).'<br/><br/>';
echo $dane;

Skrypt myślę że wszystkim zrozumiały. W skrócie, w pętli która wykona się 1000 razy wykona się nasz kod. następnie zostanie wyświetlony czas w którym została wykonana pętla. Teraz skrypt który ma testować time() oraz mktime() :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$start = microtime(1);
for($i=0;$i<=1000;$i++){
$flag = mktime();
}
$koniec = microtime(1);
$dane = 'Skrypt wykonał się w : '.($koniec-$start).'<br/><br/>';
echo $dane;
 
$start = microtime(1);
for($i=0;$i<=1000;$i++){
$flag = time();
}
$koniec = microtime(1);
$dane = "Skrypt wykonał się w : ".($koniec-$start).'<br/><br/>';
echo $dane;

U mnie na komputerze został wyświetlony taki wynik :

Skrypt wykonał się w : 0.015638113021851

Skrypt wykonał się w : 0.00020599365234375

Czyli już widać że time() jest szybszy. Ale żeby dobrze zobaczyć różnicę, podnosimy iterację z 1000 do 100000 :

Skrypt wykonał się w : 1.569167137146

Skrypt wykonał się w : 0.020911931991577

W tym przypadku różnica znacząca. prawie 1,6 sekundy oraz 2 setne sekundy.

Sam przykład wydaje się pewnie pierdołą, ale wyobraźcie sobie teraz jeśli podobnych wywołań(z rożnymi funkcjami) będziecie mięli 100 a na Waszą witrynę będzie wchodzić 100 użytkowników na sekundę. Pokazuje się już liczba 10000 takich wykonań. A to już zaczyna być dużo.

Następnym elementem który omówię są apostrofy(‘ tu tekst’) oraz cudzysłowy(„tu tekst”).  Często w kursach o php jest podawany sposób taki żeby wszystko dawać w cudzysłowach „treść”. Początkowo chciałem napisać że stosowanie cudzysłowów mocno spowalnia wykonywanie skryptu.  Lecz wpierw przetestowałem te cztery przypisania(każde oddzielnie, pierwsze dwa po milionie wykonań, drugie dwa po 10 tysięcy wykonań, oraz przed pętlą „wyczyszczenie zmiennej”).

1
2
3
4
$zmienna = "Jakiś przykładowy tekst";
$zmienna = 'Jakiś przykładowy tekst';
$zmienna = "Zapętlamy zmienną i doklejamy ją do całości. $zmienna";
$zmienna = 'Zapętlamy zmienną i doklejamy ją do całości. '.$zmienna;

Wyniki wyglądają następująco

Skrypt wykonał się w : 0.13258600234985
Skrypt wykonał się w : 0.13146283340454
Skrypt wykonał się w : 1.6217737922668
Skrypt wykonał się w : 1.6212069988251

Więc różnica jest tak mała że nie warto się nią przejmować. Ja ogólnie preferuję napisać ‘witaj ‘.$user niż „witaj $user”. Z bardzo prostego powodu, czytelność kodu. Zmienna poprzedzona $ będzie poza cudzysłowami, ogólnie zwiększa to czytelność kodu. Także w edytorach podświetlających składnię wszystko staje się czytelniejsze. A powyższy przykład to pewne obalenie mitu że są duże różnice między apostrofami a cudzysłowami.

Następna rzecz, która u mnie wynikła przy time()  i  mktime(). W skrypcie miałe trzy razy użyte mktime() (które później zamieniłem na sporo szybsze time). No ale po co robić tak, nie lepiej zrobić zmienną a potem jej używać.  Znowu używamy naszego magicznego kodu do testów który jest u góry.  Kod wygląda tak :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$start = microtime(1);
for($i=0;$i<=1000000;$i++){
$zmienna = time();
}
$koniec = microtime(1);
$dane = "Skrypt wykonał się w : ".($koniec-$start).'<br/><br/>';
echo $dane;
 
$start = microtime(1);
$time = time();
for($i=0;$i<=1000000;$i++){
$zmienna = $time;
}
$koniec = microtime(1);
$dane = 'Skrypt wykonał się w : '.($koniec-$start).'<br/><br/>';
echo $dane;

A wynik tak :

Skrypt wykonał się w : 0.21850514411926

Skrypt wykonał się w : 0.074872016906738

Znowu różnica jest spora. Warto zatem robić zmienne tymczasowe które będą przechowywały wyniki funkcji które często używamy. Podkreślam że jest to także przykład jednej funkcji z php. A teraz wyobraźcie sobie własną funkcję/metodę której wykonanie trwa powiedzmy 0,1 sekundy. A wywołacie ją 10 razy w skrypcie.(Np. funkcja która z azy danych z kilku połączonych ze sobą tabel pobiera informacje o użytkowniku).

Podsumowując. Przy pisaniu kodu trzeba przemyśleć i sprawdzać wszystkie rozwiązania. Z czasem niektóre rzeczy i „szybkie” elementy skryptów wejdą w nawyk. A co przy dużych obciążających maszynę projektach na pewno się przyda.

Następny tutorial postaram się poświęcić na optymalizację bazy danych oraz podstawowych, najbardziej typowych zapytań.

Ten wpis został opublikowany w kategorii Tutoriale i oznaczony tagami , , . Dodaj zakładkę do bezpośredniego odnośnika.

Jedna odpowiedź na „Podstawy optymalizacji skryptów PHP/ Szybkość wykonania skryptu

  1. Arkadiusz pisze:

    Dzięki za te kody :) za kilka dni przetestuje je na moim nowym projekcie :)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© blog.iFotos.pl | stworzone przez CreaWeb - profesjonalne strony www