Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: $GLOBALS['element']
Forum PHP.pl > Forum > PHP
Zigi
Mam takie pytanie:
Jak szybka jest tablica $GLOBALS w porównaniu np z np.

  1. <?php
  2.  
  3. function ta(){
  4. global $zmienna;
  5. }
  6.  
  7. ?>


lub po prostu gdy zmieniam wartość elementu w tej tablicy to jak szybko to się dzieje w porównaniu z innymi sposobami przechowywania zmiennych. smile.gif
sf
Sprawdź jeżeli Cię to interesuje.
Zigi
sf dając ten temat miałem nadzieje, że ktoś to wie i mi odpowie lub da link do takich danych. A nie da tylko bezmyślą odp. żeby sobie nabić liczbę postów.

Może nie tylko ja myślę o optymalizacji kodu.
bregovic
sf nie był bezmyślny - tylko podpowiedział ci, że możesz samemu to przetestować.
dr_bonzo
]odwolanie do globalnych zmiennych za pomoca "$GLOBALS[ 'zmienna' ]" :: 24.35369 sec
odwolanie do globalnych zmiennych za pomoca "global $zmienna" :: 19.90904 sec
1 metoda / druga = 1.2232487912393
przy 2 000 000 powtorzeniu takich operacji
  1. <?php
  2.  
  3. $x = $global_variable; // $GLOBALS[ 'global_variable' ]
  4. $global_variable = $x;
  5.  
  6. ?>
sf
Optymalizacja kodu ma to do siebie, że skupia się bardziej na rzeczach, które zajmują znaczącą ilość czasu na wykonanie, a mniejszą uwagę na `pierdołach`.

W manualu php mamy przedstawione np. zestawienie szybkości $_GET i $_SESSION, a także define i const. Tylko tak naprawdę czy to zmieni mój sposób pisania? Nie. Bo te rzeczy w zamiarze mają być do czego innego. Jak czytałeś symfonie c++ to pamiętasz rozdział gdzie było opisane czy używać define czy const, autor nie skupia się na takich pierdołach, że to mu o ileś tam wolniej działa, tylko na tym gdzie i dlaczego tego używać. Bo w zamiarze program ma wykonywać ważniejsze rzeczy i optymalizacja innej cześći programu da ZNACZĄCE rezultaty.

Dlatego jeśli masz teorię i już tak opanowałeś optymalizację kodu to możesz zacząć bawić się w takie rzeczy, które czasem coś wnoszą, ale to jak już opanujesz inne ważniejsze rzeczy. Ponownie gorąco Cię namawiam byś sam sprawdził co jest bardziej optymalne jeżeli uważasz, że to naprawdę zmieni coś w działaniu Twojego skryptu, a jeśli pytasz tylko z ciekawości to też lepiej wtedy samemu to zbadać... oczywiście przed przeszukaniem google by nie robić tego co ktoś już zrobił.

Na końcu chciałbym się odnieść do Twoich postów skoro oceniasz moje. Tak naprawdę nie skupiają sie na niczym poza Twoimi wymysłami. Przedstawiłeś jeden kod, w którym masz 2 zmienne globalne, które tak naprawdę tam nie muszą być bo można zapisać ten kod bez nich.
Zigi
Przepraszam Cię sf jeżeli poczułeś się urażony moją opowiedzią w jakimkolwiek stopniu. Nie tak miało to zabrzmieć.

Nie chce mi się już robić kolejnych porównań w szybkości wykonywania się podobnych instrukcji. Robiłem już porównania print-echo, tablice o róznej ilości wymiarów, zmienne (integer) w ""-'' lub bez niczego.
Dla mnie ważnę są te zmienne globalne ponieważ gdyby tablica $GLOBALS['element'] byłaby szybsza od deklaracji global to bardzo ułatwiło i przyspieszyło mi pisanie skryptu. Ja wykorzystuję w moim projekcjie 3 zmienne które muszą być dostępne w prawie każdej funkcji, a w czasie generowania strony jest ich wywołyna min. kilkanaście.

W manualu (php_manual_pl.chm) nie udało mi się znaleźć tego zestawienia.
orson
witam ...

powiem szczeze ze dosc dziwne wyniki mi wyszly jak sobie zrobilem tescik ... taki skrypcik:
  1. <?php
  2. $GLOBALS['test'] = 'foo!!';
  3. $test2 = 'foo!!';
  4.  
  5. function speedTest1($n) {
  6. for($i = 0; $i < $n; $i++){
  7. print $GLOBALS['test'];
  8. }
  9. }
  10.  
  11. function speedTest2($n) {
  12. global $test;
  13. for($i = 0; $i < $n; $i++){
  14. print $test;
  15. }
  16. }
  17.  
  18. function speedTest3($n) {
  19. for($i = 0; $i < $n; $i++){
  20. print $GLOBALS['test2'];
  21. }
  22. }
  23.  
  24. function speedTest4($n) {
  25. global $test2;
  26. for($i = 0; $i < $n; $i++){
  27. print $test2;
  28. }
  29. }
  30.  
  31. speedTest1(100000);
  32. speedTest2(100000);
  33. speedTest3(100000);
  34. speedTest4(100000);
  35.  
  36. ?>

i najwolniejszy jest .... <werble> .... </werble> speedTest4 exclamation.gif wykonanie zajmuje [przy 100 000 w loopie] okolo 1.8s ... a teraz 2 niespodzianka ... najszybszy jest speedTest1 exclamation.gif!!! okolo 450 ms exclamation.gif czyli poza uzywaniem zmiennych w funkcjach wazny jest rowniez sposob deklaracji ... przy deklaracji zmiennej jako globalnej na poczatku zyskujemy na wydajnosci [moze php najpierw sprawdza tablice $GLOBALS a jak zmiennej tam niema to szuka w pamieci zmiennych ?] wydajnosc jest zgodna z deklaracja kolejnych funckji ... pomiary robilem przy pomocy profilera z nusphere phped 3.3.3 i plugina DBG php debugger version 2.16.14 na php 4.3.8... powtarzane kilka razy na 2 serwerach ...
przy bardziej zyciowej ilosci loopow [100] sytuacja sie zmienila ... najszybsze funkcjie to speedTest4 i 2 [na zmiane ... roznica w zakresie bledu] a najwolniejsze to 1 i 2 ... ale to i tak nic nie zmienia ... dlatego ze wykoanie najszybszej trwalo 0.165 a najwolniejszej 0.205 ... wiec odwrotnosc wynikow moze byc spowodowana .... dlugoscia wiersza z printem [sic!] - profiler pokazuje czas wykonania poszczegolnych wierszy nie tylko czas funkcji ...

ps. mowie zeby nie bylo jakis watpliwosci zmienilem kolejnosc funkcji w pliku na odwrotna i nadal najwolniesza byla speedTest4

ps2. jak juz jestesmy przy profilerze to moze kilka ciekawostek:
  • czas wykonania linij z forami [przy 100 000] nie jest stale ... nie mam pojecia od czego zalezy ale widoczne byly spore wahania ... ale nie ma sie czym przejmowac ... minimum 90 ms maksimum 150 ms ... czyli tyle co nic ...
  • ob_start() zawsze tyle samo: 0.047 ms
  • ob_end_clean() zalezne od ilosci danych ... przy 100 okolo 0.02 ms przy 100 000 okolo 0.4 ms
pozdrowiam
Zigi
Orson fajny test porównawczy dzięki za jego wykonanie. Dziwne jest to, że dr_bonzo wyszło, co innego i teraz kto ma racje? Ponieważ stopien komplikacji skryptów jest podobny. tongue.gif

Orson ja nie używam już praktycznie nie używam profilera w phped (zrozumiałem, że to użyłeś do pomiarów) ponieważ u mnie miał bardzo duże rozbieżnośći w wynikach za każdym razem. Ja wykorzystuje funkcję, która jest w manualu daje od razu cały kod:

  1. <?php
  2.  
  3. function get_time() {
  4. list($usec, $sec) = explode(&#092;" \", microtime());
  5. return ((float)$usec + (float)$sec);
  6. }
  7. $time_start = get_time();
  8.  
  9. //cały kod, którego czas wykonywania ma być zmierzony
  10.  
  11.  
  12. echo 'Strona wygenerowana w ciągu: '.round(get_time()-$time_start, 5).'s'; 
  13.  
  14. ?>


I daje pętlę tak dużą aby wykonywała się na danym komputerze kilka sekund, a nie tylko 1s lub mniej ponieważ wynik wtedy nie jest już zbyt miarodajny.

Czekam na kolejne testy biggrin.gif
orson
witam

Cytat
I daje pętlę tak dużą aby wykonywała się na danym komputerze kilka sekund, a nie tylko 1s lub mniej ponieważ wynik wtedy nie jest już zbyt miarodajny.


to nie jest miarodajny test ... poniewaz w warunkach produkcyjnych nigdy nie masz skryptow ktore wykouja sie kilka sekund ... 10 userow i zarzniesz serwer ... dlatego zrobilem tez testy dla 100 loopow ... najbardziej miarodajny jest chyba ab [apache benchmark] ... on symuluje wywolanie przegladarki .... ale nim mozna miezyc pojedyncze funkcjie [ np. do 1 pliku dajesz funkcjie i wywolujesz plik 1000 razy i sprawdzasz jakie ma czasy] ale mi nie chcialo sie bawic wiec zrobilem profilerem bo chcialem widziec roznice w konkretnych miejscach a nie w calym skrypcie ...

pozdrawiam
dr_bonzo
Cytat
Ja wykorzystuję w moim projekcjie 3 zmienne które muszą być dostępne w prawie każdej funkcji, a w czasie generowania strony jest ich wywołyna min. kilkanaście.

Z tego wynika ze mozesz wybrac dowolna z metod, czas odwolania sie powiedzmy te 100 razy w ciagu wykonania skryptu do zmiennych globalnych to ledwie 1.2 ms (na moim kompie).

Moj kod testowy (php 5):
  1. <pre><?php
  2. /*
  3. USAGE
  4. $timer = new Timer( 'timer_name' );
  5. unset( $x );
  6. */
  7. class Timer
  8. {
  9. private $fStart_time;
  10. private $fStop_time;
  11. private $sTimer_name;
  12.  
  13. public function __construct( $sTimer_name = '' )
  14. {
  15. $this->sTimer_name = $sTimer_name;
  16.  
  17. $this->fStart_time = $this->_microtime();
  18. $this->fStop_time = 0;
  19. }
  20.  
  21. public function getTime()
  22. {
  23. return sprintf( &#092;"%.5f\", $this->_microtime() - $this->fStart_time );
  24. }
  25.  
  26. private function _microtime()
  27. {
  28. $x = explode( ' ', microtime() );
  29. return floatval( $x[ 1 ] ) + floatval( $x[ 0 ] );
  30.  
  31. }
  32.  
  33. public function __destruct()
  34. {
  35. $this->fStop_time = $this->_microtime();
  36.  
  37. if ( $this->sTimer_name !== '' )
  38. {
  39. printf( &#092;"%s :: %.5f secn\", $this->sTimer_name, ( $this->fStop_time - $this->fStart_time ) );
  40. }
  41. else
  42. {
  43. printf( &#092;"%.5f secn\", ( $this->fStop_time - $this->fStart_time ) );
  44. }
  45.  
  46. return $this->fStop_time - $this->fStart_time;
  47. }
  48. }
  49.  
  50. $global_variable = 6;
  51. $iterations = 2000000;
  52. $x1 = test_globals_speed_2( $iterations );
  53. $x2 = test_globals_speed_1( $iterations );
  54. print( ($x1 - $x2)/$x2 );
  55.  
  56. function test_globals_speed_1( $iterations )
  57. {
  58. global $global_variable;
  59.  
  60. $timer = new Timer( 'odwolanie do globalnych zmiennych za pomoca \"global $zmienna\"' );
  61. $x = 0;
  62.  
  63. for ( $i = 0; $i < $iterations; $i++ )
  64. {
  65. $x = $global_variable;
  66. $global_variable = $x;
  67. }
  68.  
  69. return $timer->getTime();
  70. }
  71.  
  72. function test_globals_speed_2( $iterations )
  73. {
  74. $timer = new Timer( 'odwolanie do globalnych zmiennych za pomoca \"$GLOBALS[ 'zmienna' ]\"' );
  75. $x = 0;
  76.  
  77. for ( $i = 0; $i < $iterations; $i++ )
  78. {
  79. $x = $GLOBALS[ 'global_variable' ];
  80. $GLOBALS[ 'global_variable' ] = $x;
  81. }
  82.  
  83. return $timer->getTime();
  84. }
  85. ?></pre>
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.