Po pierwsze, rozumiem, że w 90% aplikacji różnica w wydajności jest całkowicie nieistotna, ale muszę tylko wiedzieć, która konstrukcja jest szybsza. To i ...
Informacje dostępne obecnie w sieci są niejasne. Wiele osób twierdzi, że foreach jest złe, ale technicznie powinno być szybsze, ponieważ ma uprościć pisanie przechodzenia przez tablicę przy użyciu iteratorów. Iteratory, które znowu mają być szybsze, ale w PHP są również pozornie martwo wolne (czy to nie jest rzecz PHP?). Mówię o funkcjach tablicowych: next () prev () reset () itd. Cóż, jeśli są to nawet funkcje, a nie jedna z tych funkcji języka PHP, które wyglądają jak funkcje.
Aby trochę zawęzić : nie interesuje mnie przechodzenie po tablicach w krokach o wartości większej niż 1 (bez kroków ujemnych, tj. Odwrotna iteracja). Nie interesuje mnie również przechodzenie do i z dowolnych punktów, tylko od 0 do długości. Nie widzę również regularnego manipulowania tablicami z więcej niż 1000 kluczy, ale widzę, że tablica jest wielokrotnie przechodzona w logice aplikacji! Również jeśli chodzi o operacje, w dużej mierze tylko manipulacja strunami i echo.
Oto kilka witryn referencyjnych:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
Co słyszę wszędzie:
foreach
jest wolny, a zatemfor
/while
jest szybszy- PHP
foreach
kopiuje tablicę, po której iteruje; aby przyspieszyć, musisz użyć referencji - taki kod: jest szybszy niż plik
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
Oto mój problem. Napisałem ten skrypt testowy: http://pastebin.com/1ZgK07US i bez względu na to, ile razy uruchamiam skrypt, otrzymuję coś takiego:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
W skrócie:
foreach
jest szybszy niż wforeach
przypadku odniesieniaforeach
jest szybszy niżfor
foreach
jest szybszy niżfor
w przypadku tablicy mieszającej
Czy ktoś może wyjaśnić?
- czy robię coś źle?
- Czy odniesienia do PHP foreach naprawdę robią różnicę? Chodzi mi o to, dlaczego nie miałby go skopiować, jeśli przekazujesz przez odniesienie?
- Jaki jest równoważny kod iteratora dla instrukcji foreach; Widziałem kilka w sieci, ale za każdym razem, gdy je testuję, czas jest daleko; Przetestowałem również kilka prostych konstrukcji iteratorów, ale wydaje mi się, że nigdy nie uzyskałem nawet przyzwoitych wyników - czy iteratory tablic w PHP są po prostu okropne?
- Czy istnieją szybsze sposoby / metody / konstrukcje do iteracji przez tablicę inną niż FOR / FOREACH (i WHILE)?
Wersja PHP 5.3.0
Edycja: odpowiedź Z pomocą ludzi tutaj mogłem zebrać odpowiedzi na wszystkie pytania. Podsumuję je tutaj:
- "Czy robię coś źle?" Wydaje się, że konsensus jest następujący: tak, nie mogę używać echa w testach porównawczych. Osobiście nadal nie rozumiem, dlaczego echo jest jakąś funkcją z losowym czasem wykonania lub jak każda inna funkcja jest w jakiś sposób inna - to i zdolność tego skryptu do generowania dokładnie tych samych wyników dla każdego, lepiej niż wszystko, jest trudna wyjaśnić, chociaż po prostu „używasz echa” (cóż, czego powinienem był użyć). Jednak przyznaję, że test powinien być wykonany z czymś lepszym; chociaż nie przychodzi na myśl idealny kompromis.
- „Czy odniesienia do PHP foreach naprawdę robią różnicę? Mam na myśli, dlaczego nie miałoby ich kopiować, jeśli przekazujesz je przez referencję? ircmaxell pokazuje, że tak, dalsze testy wydają się dowodzić, że w większości przypadków odniesienia powinny być szybsze - chociaż biorąc pod uwagę mój powyższy fragment kodu, zdecydowanie nie oznacza to wszystkiego. Akceptuję, że problem jest prawdopodobnie zbyt nieintuicyjny, aby zawracać sobie głowę na takim poziomie i wymagałby czegoś ekstremalnego, takiego jak dekompilacja, aby faktycznie określić, która jest lepsza dla każdej sytuacji.
- „Jaki jest odpowiednik kodu iteratora dla instrukcji foreach? Widziałem kilka w sieci, ale za każdym razem, gdy je testuję, czas jest daleki; przetestowałem również kilka prostych konstrukcji iteratora, ale nigdy nie uzyskałem nawet przyzwoitych wyników - czy iteratory tablic w PHP są po prostu okropne? " ircmaxell udzielił odpowiedzi poniżej; chociaż kod może być ważny tylko dla wersji PHP> = 5
- „Czy istnieją szybsze sposoby / metody / konstrukcje do iteracji przez tablicę inną niż FOR / FOREACH (i WHILE)?” Dziękuję Gordonowi za odpowiedź. Używanie nowych typów danych w PHP5 powinno zapewnić albo wzrost wydajności, albo zwiększenie pamięci (z których każdy może być pożądany w zależności od sytuacji). Chociaż pod względem szybkości wiele nowych typów tablic nie wydaje się być lepszych niż array (), splpriorityqueue i splobjectstorage wydają się być znacznie szybsze. Link udostępniony przez Gordona: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
Dziękuję wszystkim, którzy próbowali pomóc.
Prawdopodobnie będę trzymać się foreach (wersji bez odniesienia) dla każdego prostego przejścia.