Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> $GLOBALS['element'], szybkość tej tablicy
Zigi
post
Post #1





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 20.11.2004

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


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. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował Zigi 2.01.2005, 15:35:47
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
sf
post
Post #2





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


Sprawdź jeżeli Cię to interesuje.
Go to the top of the page
+Quote Post
Zigi
post
Post #3





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 20.11.2004

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


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.
Go to the top of the page
+Quote Post
bregovic
post
Post #4





Grupa: Zarejestrowani
Postów: 562
Pomógł: 15
Dołączył: 8.08.2003
Skąd: Denmark/Odense

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


sf nie był bezmyślny - tylko podpowiedział ci, że możesz samemu to przetestować.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


]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. ?>


Ten post edytował dr_bonzo 2.01.2005, 18:38:57
Go to the top of the page
+Quote Post
sf
post
Post #6





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


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.
Go to the top of the page
+Quote Post
Zigi
post
Post #7





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 20.11.2004

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


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.
Go to the top of the page
+Quote Post
orson
post
Post #8





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

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


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 (IMG:http://forum.php.pl/style_emoticons/default/exclamation.gif) wykonanie zajmuje [przy 100 000 w loopie] okolo 1.8s ... a teraz 2 niespodzianka ... najszybszy jest speedTest1 (IMG:http://forum.php.pl/style_emoticons/default/exclamation.gif) !!! okolo 450 ms (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
Zigi
post
Post #9





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 20.11.2004

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


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. (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
orson
post
Post #10





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

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


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
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #11





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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>
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: 23.08.2025 - 20:38