Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wydajność naszych skryptów PHP
ixpack
post
Post #1





Grupa: Zarejestrowani
Postów: 248
Pomógł: 55
Dołączył: 1.06.2010
Skąd: mam to wiedzieć?

Ostrzeżenie: (0%)
-----


Coś mnie tknęło, przeprowadziłem kilka testów wydajnościowych. Chodziło mi o to, czy jest różnica, gdy w moim skrypcie np. w złożonej instrukcji warunkowej "if" będę używał określonej kolejności funkcji wbudowanych php, etc.

Jest różnica - i to wielka. Znalazłem ciekawą stronę http://www.phpbench.com/, gdzie podobne testy miały miejsce.

Oto co sam zaobserwowałem:

  1. $path = __DIR__.DIRECTORY_SEPARATOR."img/";
  2.  
  3. function test($path) {
  4. $t = microtime(true);
  5. while($i < 10000) {
  6. $content = scandir($path);
  7. foreach ($content as $a) {
  8. if ($a != '.' && $a != '..' && substr($a, -5, 1) != '.' && substr($a, -4, 1) != '.' && substr($a, -3, 1) != '.' && is_dir($path.$a)) $x.= $a.'<br />';
  9. }
  10. ++$i;
  11. }
  12. return (microtime(true) - $t);
  13. }
  14.  
  15. function test2($path) {
  16. $t = microtime(true);
  17. while($i < 10000) {
  18. $content = opendir($path);
  19. while (($a = readdir($content)) !== false) {
  20. if ($a != '.' && $a != '..' && substr($a, -5, 1) != '.' && substr($a, -4, 1) != '.' && substr($a, -3, 1) != '.' && is_dir($path.$a)) $x.= $a.'<br />';
  21. }
  22. closedir($content);
  23. ++$i;
  24. }
  25. return (microtime(true) - $t);
  26. }
  27.  
  28. echo test($path).'<br />';
  29. echo test2($path).'<br />';


Proste funkcje. Gdy wstawię is_dir() na początek funkcji warunkowej, to czas przetwarzania funkcji wzrośnie "dramatycznie", gdy szybki substr() wyrzucę na rzecz kilku znaków, aby kod "ładnie wyglądał", to czas wykonania funkcji również wzrośnie. Warto moim zdaniem czasami kilka znaków dodać do naszego skryptu, aby działał jak błyskawica. Kolejność jest ważna, więc jeżeli zależy nam na szybkości skryptu - pamiętajmy o tym.

Pewnie nie jest to odkrywcze dla większości wyjadaczy, ale może się jakiemuś samoukowi przyda (IMG:style_emoticons/default/smile.gif)

Czy macie może inne "rady", które wpływają na wydajność?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Nie prościej wyciąć z tablicy to:
.
..

o tak:
  1. $files = array_diff(scandir('test'), array('.', '..'));
Go to the top of the page
+Quote Post
darko
post
Post #3





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Porównywałeś iteratorem?
  1. $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/var/www/robocze'));
  2. foreach($it as $d)
  3. {
  4. echo $d->getPathname();
  5. echo '<br/>';
  6. }
Go to the top of the page
+Quote Post
ixpack
post
Post #4





Grupa: Zarejestrowani
Postów: 248
Pomógł: 55
Dołączył: 1.06.2010
Skąd: mam to wiedzieć?

Ostrzeżenie: (0%)
-----


fifi209 - no tak, ale ja wyciągam tylko katalogi, dajmy na to są różne pliki o rozszerzeniu dwu, trzy i czasem 4ro literowym. Użycie np. is_file jest tak samo wolne co is_dir - a dzięki substr oszczędzamy tu na czasie (IMG:style_emoticons/default/wink.gif) . Edit: z array_diff będzie wolniej tak samo... Co ma sens bo to też funkcja, a porównanie zmiennej jest szybsze...
darko - nie nie próbowałem, muszę o tym poczytać.

Właśnie jest masa funkcji szybszych, wolniejszych etc.
Tak czy siak chciałem pokazać, że "na pozór" nie ważna rzecz jak jakaś kolejność w if'ie - ma znaczenie (IMG:style_emoticons/default/wink.gif) A jak jeszcze można przyśpieszyć wyciąganie katalogów? Pewnie tak jak darko pisał, nie sprawdzałem, ale mi chodzi o szersze spojrzenie - nie tylko na TE podane jako przykład funkcje.

Ten post edytował ixpack 12.05.2011, 19:24:38
Go to the top of the page
+Quote Post
darko
post
Post #5





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Zainteresuj się
profilowaniem kodu
http://www.google.pl/search?q=php+profilow...b154d0baf983149
Temat: Profilowanie aplikacji
http://code42.pl/2009/06/02/profilowanie-a...staniem-xdebug/
http://www.php.rk.edu.pl/w/p/xdebug/
Go to the top of the page
+Quote Post
zegarek84
post
Post #6





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


Cytat(ixpack @ 12.05.2011, 18:29:16 ) *
Gdy wstawię is_dir() na początek funkcji warunkowej, to czas przetwarzania funkcji wzrośnie "dramatycznie"...

i właśnie tu piszesz głównie o instrukcji warunkowej a w zasadzie o operatorach logicznych i ich działaniu...

jeśli stosujesz operator && (AND) gdy po drodze warunek nie zostanie spełniony zostaje przerwane sprawdzanie i od razu zwrócony false - jeśli wszystko jest po myśli sprawdzone zostaną wszystkie warunki a więc też wykonane wszystkie funkcje po drodze i z PHP zostanie zwrócony TRUE - podkreślam jeszcze raz, że w PHP - gdyż np. w JavaScript jeśli wszystkie warunki po drodze zostaną spełnione zostaje zwrócona ostatnia wartość - czyli np. zmienna === 5 zostanie zwrócone 5, zmienna jest obiektem zostanie zwrócony obiekt, funkcja coś ostatnia zwraca zostanie przypisane to co zwróciła ta ostatnia funkcja...

z operatorem || (LUB) jest w drugą stronę - wszystkie warunki po drodze zostaną wykonane a więc i wszystkie funkcje jeśli wszystkie wyrażenia były fałszywe - jesli któryś był prawdziwy zostanie na tychmiast zwrócone true - przy czym w JavaScript zostanie zwrócona dana zmienna...

nieraz może to i zmniejszać czytelność ale np. w JS w jQuery można spotkać się z takim warunkowym wykonaniem funkcji:
e.stopPropagation && e.stopPropagation();
co znaczy tyle, że jeśli istnieje metoda dla zdarzenia stopPropagation zostanie ona wywołana - w JS jeśli własność obiektu nie istnieje jest zwracany undefined który == false (gdzie podkreślam == a nie ===)

akurat bardziej mi pasuje metoda zwracania w JS która jest podobna aczkolwiek użyteczna - jeśli jest wymagany operator true lub false zawsze zmienną można przekształcić przez podwójną negację: !!zmienna;
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 13:52