Citeam zilele tecute pe The PHP Benchmark un articol  care compară diversele metode prin care se poate parcurge un vector asociativ. În mod normal, un foreach simplu care ne-ar funriza cheia şi valoarea aflată la cel index ar fi de ajuns la fel şi soluţia unui for cu indice de la zero la numarul maxim de elemente, în cazul în care cheile vectorului ar fi numere întregi. Cu toate acestea însă, în cazul unui volum mare de date utilizarea unui foreach, uşoară şi comodă, poate duce la un timp de execuţie foarte mare

 
reset($aHash);
foreach($aHash as $key => $val)
{
    $aHash[$key] .= "a";
}

Exemplul de mai sus, are timp de executie 409 µs pe un vector de 100 de elemente.

 
$key = array_keys($aHash);
$size = sizeOf($key);
for ($i=0; $i<$size; $i++)
{
    $aHash[$key[$i]] .= "a";
}

Deşi cel de-al 2-lea exemplu presupune mai multe opreaţii decât primul, timpul de execuţie în conditiile în care furnizăm acelaşi vector de 100 de elemente este de 38 µs ... de 10 ori mai putin.

Trackback

8 comments until now

  1. eu am vazut ca au ajuns la exact concluzia inversa ;)

    Conclusion:

    In all cases I’ve found that the foreach loop is substantially faster than both the while() and for() loop procedures

  2. Concluzia lor era: “Proof in this example shows how functionally murderous the foreach() loop can be.”.

    L-am testat inainte de a posta pe blog pe mai mult de 100 de elemente, si intr-adevar rezultatul este in favoarea variantei a 2-a

  3. Depinde. Posibil ca foreach sa aiba in el ceva mecanism de try catch si sa mearga mai incet. Insa testele astea nu is tocmai concludente. Is rare cazurile cand cineva proceseaza array-uri asa mari cat sa conteze. Eu prefer in continuare foreach pentru cod mai simplu si usor de citit.

  4. PHP-ul este folosit nu numai la aplicatii mici, gen web site-uri, unde un foreach este tot ce ai nevoie, dar si la aplicatii gen call center-e, care de regula tin in spate baze de date cu sute de mii de clienti, si unde viteza conteaza la acesti parametrii.

  5. interesant rezultatul;
    si eu raman tot la foreach – chiar daca ai baze de milioane de inregistrari… nu le incarci niciodata pe toate intr-un array

  6. theheartcollector

    Pentru simplificarea codului se preferă folosirea referinţei:

    foreach($aHash as $key => &$val)
    {
    $val .= “a”;
    }

    Parcă citisem şi eu undeva despre măgăria asta, şi, deşi s-ar putea să spun o prostie, faptul ca un foreach se mişcă aşa de lent s-ar putea să fie o consecinţă a faptului că acesta este mult mai generic decât un for, ştiind să manipuleze iteratori implementaţi cu ajutorul SPL-ului (http://php.net/manual/en/book.spl.php)

  7. bullshit

    PHP 5.2.1
    APC disabled
    Athlon X2 1.8GHz, 2GB DDR2 800MHz (Dual Channel)

    Am testat cu un array de 100, 1000, 10000 si 100000 de elemente. Rezultatele sunt identice!

    Voi cu ce versiune de PHP ati testat?

  8. nu mai am datele exacte de acum un am insa imi aduc aminte ca era pe un shared hosting, centOS, intel, nu mai mult de 2GHz procesorul si ram pe la 1G

Add your comment now