SPL vs SPF

Od pewnego czasu zastanawiałem się, o ile SPL jest wolniejsze od klasycznych funkcji w PHP. Jeden z ostatnich tematów na forum skłonił mnie do zrobienia małego testu. Do boju stanęły funkcje opendir() i readdir() przeciwko DirectoryIterator i extensionFilter (implementacja FilterItarator).

Obu staralem się zapewnić jednakowe środowisko uruchomieniowe. Zrezygnowałem z testu w przeglądarce na rzecz konsoli w mojej Fedorce. Nie jest to oczywiście w pełni miarodajny test, ale na pewno da Wam jakieś pojęcie na ten temat.

Małe wyjaśnienie:
SPF to Standard PHP Functions
SPL to Standard PHP Library (tutaj konkretnie chodzi o DirectoryIterator)

Test 1 kod testu

- 100 plików graficznych w katalogu
- filtr na rozszerzenie .jpg
- 5 iteracji skryptu po 5000 iteracji katalogu każda

Iteracje:

SPF: 2.31422591209
SPL: 3.24030208588

SPF: 2.37819099426
SPL: 3.2218940258

SPF: 2.42922902107
SPL: 3.95322990417

SPF: 2.70885491371
SPL: 3.16421794891

SPF: 2.37303519249
SPL: 3.23532986641

Łączne czasy:

SPF: 12.2035360336
SPL: 16.8149738312


Spora róznica na niekorzyść SPL. Niemal sekunda różnicy przy każdej iteracji.

Test 2 kod testu

Warunki takie same jak poprzednio, lecz dodatkowo tworzona jest tablica znalezionych plików

Iteracje:

SPF: 2.95562911034
SPL: 4.24484300613

SPF: 2.96667480469
SPL: 4.27122497559

SPF: 2.84061980247
SPL: 4.13145589828

SPF: 3.03891181946
SPL: 4.36569881439

SPF: 2.84957885742
SPL: 4.10521483421

Łączne czasy:

SPF: 14.6514143944
SPL: 21.1184375286


Widać wyraźnie, że SPL znów przegrało. Nic dziwnego, bo zmeniło się niewiele. Popatrzmy jednak dalej.

Test 3 kod testu

Warunki jak w teście pierwszym, ale tutaj musimy przygotować dane dla innej funkcji. Wyniki nadal przemawiają za klasycznym podejściem, ale już tak nie biją po oczach jak wyniki poprzednich testów.

Iteracje:

SPF: 2.95964694023
SPL: 3.29182982445

SPF: 2.90222501755
SPL: 3.28053212166

SPF: 2.91018295288
SPL: 3.25611805916

SPF: 3.86296701431
SPL: 3.30490803719

SPF: 2.89003896713
SPL: 3.25660395622

Łączne czasy:

SPF: 15.5250608921
SPL: 16.3899919987


Nawet przekazanie tablicy SPF przez referencję niewiele pomaga - różnice sięgają dziesiątych części sekundy. Wiedziony jakimś dziwnym przeczuciem umieściłem w katalogu 1000 plików...

Iteracje:

SPF: 33.4898278713
SPL: 33.1929478645

SPF: 36.1754798889
SPL: 37.2197220325

SPF: 36.7499339581
SPL: 37.4044959545

SPF: 27.3576068878
SPL: 28.5377857685

SPF: 27.4663441181
SPL: 28.3249459267

Łączne czasy:

SPF: 161.239192724
SPL: 164.679897547


Przy takiej ilości plików, klasyczna metody oparte o funkcje tracą swoją przewagę, bo różnica jednej sekundy to nawet nie jeden procent.

DirectoryIterator, jak zapewne większość klas SPL jest nieco wolniejszy. Wydaje mi się jednak, że korzyści płynące z używania SPL przewyższają te uzyskiwane poprzez klasyczne metody. Mniej kodu, bardziej elegancko - za to trzeba po prostu zapłacić

Jeśli znajdę czas, to przetestuję RecursiveDirectoryIterator w podobny sposób.

Komentarze

Info:

Nick:
Treść:

Tuner napisał(a)
Dzięki za szybki benchmark. Z niecierpliwością czekam na test RecursiveIteratora. Najchętniej przeczytałbym jednak o iteracji po dużych tablicach, nie obiektach.
cysiaczek napisał(a)
Iteracja po tablicach niewiele różni się od iteracji po obiektach. W sumie, to obiekty po prostu dostarczają bardziej spójny interfejs dostępu do przetwarzanych danych. Po to też powstały iteratory, aby można było używać ich w petlach foreach(), czy while().
DeyV napisał(a)
hej

Właśnie przeglądałem Twoje wpisy w Google Reader, i chciałem przeczytać całość, I wygląda na to, że RSS który udostępniasz, podaje błędnie ścieżki do wpisów - tj.
http://localhost/blog/show/id_4/

Pozdrawiam
cysiaczek napisał(a)
Rzeczywiście - zły wpis w konfiguracji - dzięki za zwrócenie uwagi :)
 
Symfony_button