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.

poniedziałek, 3 listopada 2008

Continuous integration - Bitten

Pisanie testów (unit testów, testów funkcjonalnych, selenium) stało się integralną częścią większości projektów. Jednak uruchamianie dużej liczby testów może zajmować sporo czasu. Ponadto jeżeli nad projektem pracuje kilku programistów może pojawić się typowy problem, że u kogoś działa a u kogoś innego nie. Warto więc stworzyć środowisko testowe, na którym testy będą uruchamiane automatycznie.
Jeżeli korzystasz z Traca i Subversion możesz skorzystać z Bittena (http://bitten.edgewall.org/).
Poprzez zdefiniowane regułki Bitten aktualizuje kod w środowisku testowym (svn update), uruchomia skrypty migracji bazy, konfiguracji oraz uruchamia testy.
Procedura jest uruchamiana przy każdej zmianie kodu a raport jest dostępny poprzez Traca (http://bitten.edgewall.org/build/trunk)