czwartek, 27 listopada 2008

Operatory post i pre-increment w PHP

Na pierwszy rzut oka prawie nie ma roznicy:
$i = 0;
while ($i < 1000000)
{
    $i++;
}



czy:

$i = 0;
while ($i < 1000000)
{
    ++$i;
}

W każdym razie wynik będzie ten sam. A jednak różnica w implementacji obu operatorów jest spora. W pierwszym przykładzie użyłem operatora post-increment, który dodaje do 1 do zmiennej $i po wykonaniu lini kodu. W drugim przypadku 1 jest dodawane przed wykonaniem lini kodu.
W większości zastosowań nie ma to znaczenia, jednak przy dużej ilości takich operacji może mieć znaczący wpływ na wydajność naszej aplikacji. A co za tym idzie, zużycie czasu procesora, energii, efekt cieplarniany ;)
Dzieje się tak, ponieważ aby wykonać $i++ jest konieczne wykonanie kopii zmiennej. Czyli w efekcie mamy "dwie" zmienne $i. Jedna przechowuje poprzednią wartość a druga przechowuje wartość po dodaniu jedynki.
Zrobiłem pare testów szybkości na powyższym kodzie. Czas wykonania pętli z zastosowaniem $i++ jest o 10% większy niż wykonanie tej samej pętli z zastosowaniem ++$i.
Warto na takie sprawy zwracać uwagę, szczególnie w projektach w których przetwarzamy duże ilości danych.

W następnych postach postaram się opisać trochę więcej zagadnień związanych z wydajnością oraz optymalizacją kodu.

1 komentarz: