dlaczego nie warto uzywac foreach ?
testcase wyglada tak:
jest sobie tablica:
- 10224 elementow
- 10 znaków każdy element
- 356954 znakow to dlugosc powstalego po zlaczeniu stringa
funkcja mierzaca czas:
function t(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
test1 (while):
$t1 = t();
$r = '';
while ( list($k, $v) = each($test) )
{
$r .= sprintf('key: %s | value: %s
‘, $k, $v);
}
$t2 = t();
test2 (foreach):
$r = '';
foreach ($test as $k => $v)
{
$r .= sprintf('key: %s | value: %s
‘, $k, $v);
}
$t3 = t();
rezultat jest generowany przy kazdym wejsciu na strone.
juz wszyscy wiedza, czemu nie powinno sie uzywac foreach() ? ;)
update:
testy byly wykonywane na sofcie:
php jako cgi, poprzez suphp
a tutaj linki do zrodel wykorzystanego przeze mnie testu:
foreach:while1.php (807 bajtow)
foreach:while_array.php (141 kilobajtow)
i nie smiac sie z pieknej tablicy :P do celow testowych byla super ;)
update2:
no to dalem dupy. na calej linii. gdyby nie piecu, to bym nawet o tym nie wiedzial… ;) chujnia, chyba bede musial przestac uzywac mojej ulubionej konstrukcji :P a mialo byc tak milo… :P
tylko czemu mi az tak glupio ? ;)
while (t2 - t1): 5.48362731934E-05
foreach (t3 - t2): 0.0457820892334
Może się mylę, ale to pierwsze wygląda na szybsze ;)
Adres bezpośredni: http://urzenia.net/132/php-foreach-vs-while/#comment-79
mylisz sie ;)
pierwsze to wynik t2 - t1: wyszlo, ze ta akcja trwala ponad 5s, jakies 5,5s. i tyle trwa dzialanie petli w while()
natomiast za pomoca foreach (zapomnialem dodac ze testy byly na paache1 i php5.0.4), zajelo to 0.046s. “lekka” roznica :)
jako dodatek, o czym tez nie wspomnialem wczesniej, zanim zaczelem jechac whilem i testowac, puscilem, dla rozgrzania sie procesora, dokladnie ta sama petle while(). dopiero pozniej pierwsze pobranie czasu, petla while(), drugie pobranie czasu, petla foreach(), trzecie pobranie czasu i wyniki. foreach jest szybszy ponad 100x (!) (z dokladnoscia do 3miejsc po przecinku: 5.484 / 0.046 = 119,217 !!!)
Adres bezpośredni: http://urzenia.net/132/php-foreach-vs-while/#comment-80
No zaraz, ale w tym pierwszym mamy taki e-05 na końcu, co oznacza, że robi nam się z tego 0.0000548362731934 sekundy…
Adres bezpośredni: http://urzenia.net/132/php-foreach-vs-while/#comment-83
wiesz co… ponizyles mnie… tzn samo to zrobilem, ale Ty to mi uswiadomiles ;)
jak to sie stalo, ze nie zauwazylem tej koncoweczki, to ja nie wiem. kurde, ale glupio ;)
no nic, poprawilem tresc wpisa i tyle. wyjde jak sie przestane wstydzic :P
Adres bezpośredni: http://urzenia.net/132/php-foreach-vs-while/#comment-84
Szybkość wyżej przedstawionych konstrukcji zależy od wielkości tablicy… a w powyższym teście brakuje resetowania wskaźnika tablicy
$t1 = t();$r = '';
reset($test);
while ( list($k, $v) = each($test) )
{
$r .= sprintf('key: %s | value: %s', $k, $v);
}
$t2 = t(); ;)
Adres bezpośredni: http://urzenia.net/132/php-foreach-vs-while/#comment-1555
Hm, nie da się ukryć, że masz rację. Stara wersja: tests/foreach:while1.php
Nowa wersja: tests/foreach:while2.php
Różnica całkiem znaczna, czyli (przynajmniej w wersji PHP5) foreach() jest jednak sensowną alternatywą dla while(). Zarówno ze względu na czytelność, jak i szybkość. Dzięki za zwrócenie uwagi :)
Adres bezpośredni: http://urzenia.net/132/php-foreach-vs-while/#comment-1721
php: foreach vs while, odsłona druga…
Kilka dni temu, Mariusz Jakubowski aka kg zauważył jeden, dość poważny brak w moich testach dotyczących szybkości foreach() i while(), mianowicie brak w odpowiednim miejscu reset()-owania tablicy. Dość diametralnie zmieniło to …
Adres bezpośredni: http://urzenia.net/132/php-foreach-vs-while/#comment-1887