Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [optymalizacja] Porównanie funkcji pod względem szybkości!
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
cahe
Mam pewien pomysł - umieścmy w tym topicu informacje o wyższości jednej funkcji/metody nad inną. Proszę nie offtopować ;-).

Może zaczne:

Porównanie:

foreach($tablica as $key => $value) i list($key, $value) = each($tablica)

Skrypt testowy:

  1. <?php
  2. mt_srand((double) microtime() * 100000);
  3. for($i = 0; $i < 10000; $i++)
  4. {
  5. $n[] = mt_rand(0, 1000000);
  6. }
  7.  
  8. foreach($n as $key => $tmp)
  9. {
  10. $tmp = abs($tmp);
  11. }
  12.  
  13. ?>


Oraz:
  1. <?php
  2. mt_srand((double) microtime() * 100000);
  3. for($i = 0; $i < 10000; $i++)
  4. {
  5. $n[] = mt_rand(0, 1000000);
  6. }
  7. while(list($key, $value) = each($n))
  8. {
  9. $value = abs($value);
  10. }
  11.  
  12. ?>


<b>Wyniki:</b>

Wszystko testowane: ab -c 60 -n 1000 na Apache 1.3.28@Win2k + php4.3.2

1. foreach():
Time taken for tests: 83.281250 seconds
Requests per second: 12.01 [#/sec] (mean)
Time per request: 4996.875 [ms] (mean)

2. list() i each():
Time taken for tests: 101.812500 seconds
Requests per second: 9.82 [#/sec] (mean)
Time per request: 6108.750 [ms] (mean)


Czyli przewaga (spora) po stronie foreach :-).

Proszę chętnych o zamieszczanie swoich wyników porównujących najczęściej używane przez Was funckje. Może być fajnie :-).

P.S. Czekajcie na więcej z mojej strony :-).
FiDO
Zawsze bardziej lubilem foreach'a niz each i tyko z tego 1 korzystalem. Czulem, ze cos w tym musi byc smile.gif

Widze, ze ab.exe Ci sie bardzo spodobal biggrin.gif
menic
Sorry za mały offtopic ale musiałem winksmiley.jpg Bardzo trafiony temat. Naprawdę mi sie super podoba. Mam nadzieję że sie ładnie rozwinie 8) biggrin.gif
kurtz
Hej

- preg_* kontra ereg* -> pregi szybsze

- "ala" kontra 'ala' -> "ala" szybsze (ale nie "ala ma $kota")
czyli: (bardziej po polsku winksmiley.jpg - DeyV)
Cytat
najwolniej: $test = "ala ma $kota ";
dobrze:  $test = 'ala ma ' .  $kota ;
minimalnie szybciej:  $test = "ala ma ".  $kota ; (minimalna różnica - na granicy błędu)



- obiekty kontra funkcje -> funkcje
..


http://phplens.com/lens/php-book/optimizin...bugging-php.php misie drogie ... winksmiley.jpg


Pozdrawiam
kurtz
A na dokładke artykul Leszka Krupinskiego

-> http://leon.w-wa.pl/artykul.html

tlumaczenie orginalnych dokumentow znalezionych w babilonie pod redakcja kurtza i phestusa ;)p
cahe
Mówi się dużo na temat tego, że file() jest wolniejszy od fgets(). Dodam również jedną inną funkcję - file_get_contents. Sprawdźmy :-).

Wszystko testowane: ab -c 60 -n 1000

Plik ma format:

Kod
c|x|a [nowa linia]

c|x|a [nowa linia]

...

Skrypt 1 (file):
  1. <?php
  2. //Otwarcie pliku - 10 tys. linii.
  3. $plik = file(&#092;"dane.txt\");
  4.  
  5. foreach($plik as $linijka)
  6. {
  7. unset($linijka);
  8. }
  9. ?>


<b>Wyniki: </b>

Time taken for tests: 60.171875 seconds
Requests per second: 16.62 [#/sec] (mean)
Time per request: 3610.313 [ms] (mean)
Time per request: 60.172 [ms] (mean, across all concurrent requests)


Skrypt 2 (fgets):

  1. <?php
  2. //Otwarcie pliku - 10 tys. linii.
  3. $plik = fopen(&#092;"dane.txt\", \"rb\");
  4.  
  5. while(!feof($plik))
  6. {
  7. $linijka = fgets($plik);
  8. unset($linijka);
  9. }
  10. ?>


Tryb rb - odczyt + binarny (funkcja file() jest binary safe).

<b>Wyniki: </b>
Time taken for tests: 69.531250 seconds
Requests per second: 14.38 [#/sec] (mean)
Time per request: 4171.875 [ms] (mean)
Time per request: 69.531 [ms] (mean, across all concurrent requests)

A więc <b> WOLNIEJ! </b> exclamation.gif :-).

Czas na file_get_contents. Będziemy dzielić wynik na linijki, żeby było sprawiedliwie.

Skrypt 3 (file_get_content):
  1. <?php
  2. //Otwarcie pliku - 10 tys. linii.
  3. $plik = file_get_contents(&#092;"dane.txt\");
  4.  
  5. $plik = explode(&#092;"n\", $plik);
  6.  
  7. foreach($plik as $linijka)
  8. {
  9. unset($linijka);
  10. }
  11. ?>


<b>Wyniki:</b>
Time taken for tests: 61.656250 seconds
Requests per second: 16.22 [#/sec] (mean)
Time per request: 3699.375 [ms] (mean)
Time per request: 61.656 [ms] (mean, across all concurrent requests)

Minimalnie wolniejszy od file(), ale zawsze ;-).

A więc w tej konkurencji wygrał file()! Oczywiście jeśli chodzi nam o dostęp do każdej liniki z osobna. Następnym razem sprawdzimy jak się te funkcje sprawdzają przy odczycie całych plików + pakowania ich do jednej zmiennej (coś czuje że file_get_contents wygra ;-)).
cahe
Cytat
Zawsze bardziej lubilem foreach'a niz each i tyko z tego 1 korzystalem. Czulem, ze cos w tym musi byc smile.gif

Widze, ze ab.exe Ci sie bardzo spodobal biggrin.gif


Tak, szukałem go od dłuższego czasu :-).

Cytat
Sorry za mały offtopic ale musiałem winksmiley.jpg Bardzo trafiony temat. Naprawdę mi sie super podoba. Mam nadzieję że sie ładnie rozwinie 8) biggrin.gif


Ty mi tu nie offtopuj tylko napisz coś ciekawego - porównaj jakieś funkcje. Może być więcej niż dwie. 8)

Dla zainteresowanych: Szukajcie programu ab.exe jeśli go nie macie (ja nie miałem w apache1.3.28 na win2k) - link jest na forum o apache, temat Apache Benchmark
Seth
Aby nie zawalac forum php przyklejonymi topicami wrzucilem ten temat do php Pro
cahe
Cytat
Aby nie zawalac forum php przyklejonymi topicami wrzucilem ten temat do php Pro


To swietnie :-). A ponieważ dzisiaj wróciłem z weekendu - spodziewajcie sie na dniach jakis nowosci w topicu :-).
e-Gandalf
Kurtz: misiu drogi, a mozesz wyjasnic ta zagwozdke z przewaga "ala" nad 'ala'? Bo dla mnie jest to calkowicie nie logiczne... "" powinien przeszukiwac zawartosc na okolicznosc roznych pierdol PHPowych, a '' nigdy tego nie robi. Jakim wiec sposobem "" moze byc szybsze?!? (nie testowalem - mam maszyne w rozpdzie lekkim teraz :/)
DeyV
zobacz testy - ja też byłem zdziwiony. (Ale sądzę, że błąd jest na granicy błędu, więc przy zwykłym stringu, nie zawierajacym zmiennych - nie ma to znaczenia. Natomiast przy wstawianiu zmiennych __należy__ stosować zapis "test" . $var . "test2"

ps. juz to dokładnie omawialiśmy (stąd te testy), tak więc te ostatnie posty pójdą do usunięcia.
DeyV
ostatnio trafiłem na takie porównanie: ( http://php.weblogs.com )
Cytat
Twisting by the PHPool  
Recently I posted a link to Twisted, a python library for developing socket servers. This generated a storm of interest as to whether php is suitable for developing similar custom networking applications. You should read the commentary in the above link for some interesting remarks by BDKR.  
So i benchmarked Nanoweb, a webserver written in php, against Apache. Test was repeatedly requesting a 4K HTML file (adodb-session.htm), using M'soft's WAST set at 10 concurrent threads. All software running on a 2.6 Ghz Win XP machine. php-CLI 4.3.3 was used to run Nanoweb.  

             Requests/Sec
Nanoweb          176
Apache 1.3.28    300

These figures suggest that a php networking app (Nanoweb) running on brand-new 2003 hardware (3 Ghz PC) will be faster than a program written in C (Apache) on good year 2000 hardware (1Ghz PC).  
Now if someone had told me in 2000 that in 3 years I would be able to run a web server written in php, and that it would run faster than the Apache of the year 2000, I wouldn't have believed the person. I think this sort of performance is a fantastic achievement for php and its developers.  

PS: For those of you who read the Twisted docs, you will see that it does not use threads, but callbacks. It should be possible to do something similar in php too.  

New: If you click on Discuss, you will see that Kemar has posted some benchmarks on Linux, and the numbers are quite different from Windows XP (9 Oct 2003)  


Nieco zaskakujące, nieprawdaż? Ale za to jak pozytywnie...
web86
Bardzo ciekawe.... Tylko jak to nanoweb napisano bo to mnie najbardziej interesuje.... Hmm a to dopiero zagadka...
web86
No no no, sciagnalem z ciekawosci z nanoweb.si.kz najnowsza wersje i zainstalowalem ja. Przyznam ze rzeczywiscie zaskoczyla mnie wielkosc pakietu (250 kb) no a sam opis:
Cytat
Nanoweb is an HTTP server written in php, designed to be small, secure, and extensible.  

It is distributed under the terms of the GNU General Public License.

Nanoweb's main features are :

- HTTP/1.1 compliance
- Powerful and easy configuration
- Modular architecture
- FastCGI, CGI and Server side includes support
- Name and port based virtual hosts
- Access control lists
- htpasswd, MySQL, PostgreSQL and LDAP authentication support
- Themes for server generated content
- Apache compatible log format, MySQL logging
- Directory browsing
- inetd support and SSL via external helpers
- Denial of Service protection
- Proxy Server extension
- Filters and gzip support
- RBL support (mail-abuse.org)
- Extension Protocols (request methods) support
- ... and a lot more
tez jest calkiem interesujacy. Biore sie za testy ;>
halfik
w sprawie tych stringow, to sprawa jest oczywista:

"bla bla bla bla $zmienna"

musi być wolniejsze od

'bla bla bla'.$zmienna

ponieważ w pierwszy mprzypadku interpreter sprawdza cały ciąg i w razei potrzeby podstawie odp. wartości w miejsca zmiennych, a w drugim przypadku interpreter sprawdza doiero od momentu wystapienia pierwszego cudzyslowu. interpreter po prostu nie sprawdza apostrofów - wypluwa ich zawartość na ekran tak jak to programista stworzył :wink:


p.s po co Wam do mierzenia czasu wykonywnia sie poszczegolnch funkcji czy blokow jakies pluginy do apache'a ? a mktime() juz nie starcza ? :wink:
FiDO
Pozwole sobie odswiezyc troche topic smile.gif

Znalazlem ciekawy benchmark najzwyklejszej czynnosci jaka jest stosowanie petli...
Az zdziwilem sie, ze moze byc tyle tego sposobow. Zapraszam do obejrzenia wyników: http://www.phpinsider.com/benchmarks_phemp...l_benchmark.php
Najpierw zobaczcie sobie zrodla (jest tam odnosnik do nich), gdzy bez tego nie wiadomo specjalnie o co chodzi.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.