Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wydajność naszych skryptów PHP
Forum PHP.pl > Inne > Hydepark
ixpack
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 smile.gif

Czy macie może inne "rady", które wpływają na wydajność?
Fifi209
Nie prościej wyciąć z tablicy to:
.
..

o tak:
  1. $files = array_diff(scandir('test'), array('.', '..'));
darko
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. }
ixpack
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 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 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.
zegarek84
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;
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.