[#] Szybsze aplikacje w php

( Ostatnio zmieniony śr., 28/05/2008 - 15:16 )
 

Parzysta czy nie parzysta

Wolniej:

$i = 10;
if ($i % 2) {
  // nie parzysta (ma resztę)
} else {
  // parzysta
}

Szybciej:

$i = 10;
if ( $i&1 ) {
  // nie parzysta
} else {
  // parzysta
}

Sprawdzanie długości zmiennej tekstowej.

Wolniej:

if (strlen($zmienna)<=5) { echo 'Wymagane conajmniej 6 znaków'; }

Szybciej:

if (!isset($zmienna{5})) { echo 'Wymagane conajmniej 6 znaków'; }

isset() w przeciwieństwie do strlen() nie jest funkcją tylko konstrukcją językową, w związku z czym sprawdzanie długości ciągu za jej pomocą jest szybsze.

Sprawdzenie czy zmienna jest pusta

Wolniej:

if ($zmienna = '') { ... }

Szybciej:

if(empty($zmienna)) { ... }

Wzrost wydajności to około 20%.

Post-inkrementacja i pre-inkrementacja

Wolniej:

$liczba++;

Szybciej:

++$liczba;

Ponieważ w drugim przypadku tworzona jest dodatkowa zmienna. Dlatego jeśli inkrementacja nie jest dokonywana w warunku, lepiej stosować pre-inkrementację (++$liczba).

Szybsze przeszukiwanie tablic

Wolniej:

$owoce = array('jabłka', 'gruszki', 'wiśnie', 'czereśnie', 'banany');
if (in_array('banany', $owoce)) { ... }

Funkcja in_array() działa w oparciu o iterację wszystkich elementów tablicy.

Szybciej:

$owoce = array('jabłka' => 1, 'gruszki' => 1, 'wiśnie' => 1, 'czereśnie' => 1, 'banany' => 1);
if (isset($owoce['banany'])) { ... }

Wyjaśnienie: Metoda ta wymaga przekształcenia tablic na tablice asocjacyjne (haszujące) i pochłania więcej pamięci na składowanie danych, ale przeszukiwanie nie opiera się już na iteracji i jest wielokrotnie szybsze.

Weryfikacja typów danych

Wolniej:

if (preg_match("!^[0-9]+$!", $zmienna)) { echo 'liczba'; }

Szybciej:

if (ctype_digit($zmienna)) { echo "liczba"; }

PHP posiada rozszerzenie ctype udostępniające dostęp do funkcji is_…() z języka C. Przykładowo, aby sprawdzić czy zmienna jest liczbą możemy poprzez funkcję PHP ctype_digit() odwołać się do funkcji C is_digit(): Jest to wielokrotnie szybsza metoda niż zastosowanie wyrażeń regularnych.

Warunek w pętli for

Wolniej:

for ($i=0; $i<sizeof($tablica); ++$i) { ... }

Szybciej:

$rozmiar=sizeof($tablica);
for ($i=0; $i<$rozmiar; ++$i) { ... }

Przy tworzeniu pętli warunkowych, należy zawsze pamiętać, że warunek będzie ewaluowany w każdym kroku iteracji.

switch{…} a if…elseif…elseif…

Staraj się zawsze w miarę możliwości stosować SWITCH Switch dokonuje tylko raz ewaluacji wyrażenia, podczas gdy if…elseif… robi to wielokrotnie.

Załączanie zewnętrznych plików

Wolniej:

include('plik.php');

Szybciej:

include('./plik.php');

Sprawdzenie systemu operacyjnego

$isWindows = DIRECTORY_SEPARATOR == '\\';
if( $isWindows) { ... }

Znacznik czasu – timestamp

Wolniej:

$time = time();

Szybciej:

$time = $_SERVER['REQUEST_TIME'];

Porównanie stringów

Wolniej i wogóle nie zalecane!:

if (substr(PHP_OS, 0, 3) == 'WIN') { ... }

if (strtolower(substr(PHP_OS, 0, 3))) == 'win') { ... }

Szybciej:

if (!strncmp(PHP_OS, 'WIN', 3)) { ... }
if (!strncasecmp(PHP_OS, 'WIN', 3)) { ... }

Indeksowanie tablic

Wolniej:

$foo[bar] = 1;

Szybciej:

$foo['bar'] = 1;

Wyjaśnienie: Nie stosuj jako indeksu tablicy stałych. Szybsze jest używanie stringów lub liczb.

Wielowymiarowe tablice

Wolniej:

$a['b']['c'] = array();
for($i = 0; $i < 5; ++$i) {
  $a['b']['c'][$i] = $i;
}

Szybciej: (odwołanie przez referencję)

$ref =& $a['b']['c'];
for($i = 0; $i < 5; ++$i) {
  $ref[$i] = $i;
}

Uzycie warunku IF

Wolniej:

if ( ... ) { ... } else { ... }

Szybciej:

(...) ? ... : ...

Używanie apostrofów

Wolniej:

echo "text";

Szybciej:

echo 'text'

Wyjaśnienie: W stringu „…“ interpreter wyszukuje zmiennych, natomiast w ‚…‘ już nie.

Komentarze

Usunięcie komentarzy z kodu powoduje wzrost wydajności interpretera php.

Boolean w bazach danych

Zamiast stosować pola w bazie danych typu BOOLEAN lepiej użyć int np.: isTrue int,

Zobacz również:

http://www.alt-php-faq.org/local

5
Twoja ocena: Brak Średnio: 5 (2 głosy)