Dawno mnie tu nie było... :P
Optymalizacja PHP
Q: Co jest szybsze, post-inkrementacja czy pre-inkrementacja?
A: Zdecydowanie pre-inkrementacja, gdyż nie tworzy się dodatkowa zmienna. Jeżeli nie używasz inkrementacji w warunku, zastosuj pre-inkrementację.
for ($i = 0; $count = array($array); $i < $count; ++$i)
{
//kod...
}
++$zmienna
W powyższym przykładzie została zastosowana jeszcze inna metoda optymalizacji. Mianowicie w inicjalizacji pętli ($i = 0; $count = array($array)) utworzyłem zmienną z ilością indeksów tablicy, a w warunku trwania porównałem tą zmienną z $i. Dla dużych tablic jest to szybsze od $i < count($array), gdyż funkcja count wykonuje się za każdym przebiegiem pętli. :D
Q: Jak sprawdzić czy ktoś wpisał np. conajmniej 10 znaków?
A: Trzeba sprawdzić czy istnieje 9 indeks tablicy tej zmiennej. Tak więc zamiast konstrukcji:
if (strlen($string) <= 10)
{
//kod...
}
stosować:
if (!isset($string{9}))
{
//kod...
}
Funkcja isset jest konstrukcją języka, więc sprawdzenie długości ciągu bedzie znacznie szybsze.
Q: Jak szybciej dołączać pliki do skryptu?
A: Najlepiej rozdzielić poszczególne funkcje aplikacji na klasy, a każda z nich w osobnym pliku, lecz takie rozwiązanie nie zawsze jest pożądane. Wtedy pozostaje porozdzielanie funkcji do plików (te które są używane za każdym wywołaniem skryptu to do jednego pliku, te rzadziej używane do drugiego). Jeszcze innym ważnym aspektem tego problemu jest sposób dołączania plików:
Taki kod:
include('./funkcje.php');
wykona się o wiele szybciej od tego:
include('funkcje.php');
ponieważ interpreter PHP od razu dostaje relatywną lub absolutą ścieżke do pliku, a tak to najpierw szuka tego pliku w innych katalogach.
Q: Która z funkcji do wyswietlania danych jest optymalniejsza?
A: Jeżeli chodzi o wyświetlanie tekstu niesformatowanego to dostepne są dwie funkcje: `echo` i `print`. Otóż szybszą funkcją jest `echo`, gdyż print oprócz tekstu zwraca jeszcze zmienną typu bool (true lub false) w zależności od stanu powodzenia operacji (analogicznie false przy wystapieniu błędu, a true jest wszystko jest OK).
Q: Jest inny sposób na sprawdzenie typu zmiennej niż wyrażenia regularne?
A: Oczywiście, najbardziej polecam funkcje z rodziny `is`, np.: is_numeric, is_int, is_array, is_bool itp. (mozna narzucić typ poprzez funkcję settype).
Ale istnieją jeszcze inne sposoby. w PHP 4 >= 4.0.4 i PHP 5 zaoferowano rodzinę funkcji `ctype` pochodzącej z biblioteki C.
Przykład zastosowania ctype:
$token = 'lpr666';
if (ctype_alnum($token)) //równoznaczne z PERL'owskim: /^[a-z0-9]*$/i
{
//kod... zgadza się
}
if (ctype_digit($token)) //akceptuje tylko tekst/liczbę w postaci całkowitej (np. 666, 33, 6 itp.)
{
//kod... nie zgadza się
}
Q: Kiedy mam korzystać z IF/ELSEIF/ELSE, a kiedy z Switch?
A: Kiedy wiele razy porównujemy tą samą zmienną, to szybszy będzie switch. Switch też się nie przyda przy skompikowanych algorytmach/warunkach. Różnica jest taka, że switch tylko raz wykonuje wyrażenie a IF robi to wielokrotnie.
$pis = ':(';
switch ($pis)
{
case ':(':
echo 'jest źle';
break;
case ':)':
case ':D':
case ':]':
echo 'też jest źle :D';
break;
default:
echo 'bedzie jeszcze gorzej :]';
break;
}
Q: Jaka jest najszybsza metoda sprawdzania czy liczba jest parzysta/nieparzysta?
A: Wiele osób używa `modulo` 2, czyli dzielenia z resztą przez 2, natomiast o wiele szybszy jest iloczyn bitowy 1.
Przykład:
$liczba = 6;
if ($liczba & 1)
{
//kod... liczba nieparzysta
}
else
{
//kod... liczba parzysta
}
Zły przykład:
if ($liczba % 2)
{
//kod... liczba nieparzysta
}
else
{
//kod... liczba parzysta
}
Mam nadzieję, że ten krótki FAQ przyda się wielu osobom! :P
Pozdrowienia - rzymek01
...