Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Co szybsze: row czy array, Czy nieużyte funkcje wpływają na czas ładowania strony?
Forum PHP.pl > Forum > Przedszkole
Xeer
Witam.

Mam dwa pytania związane z szybkością wykonywania.

1. Parę lat temu czytałem gdzieś, że mysqli_fetch_row jest szybsze od mysqli_fetch_array, jednakże teraz nigdzie nie mogę tego znaleźć i dlaczego, a może to były tylko jakieś brednie i mi się utkwiło w pamięci?

2. Jeżeli nawaliłbym sobie np. 100 funkcji w pliku i nie użył ich to ma to wpływ na szybkość ładowania się strony? Czy dopiero gdy użyję danej funkcji to ma ona wpływ na szybkość ładowania strony?

Dziękuję z góry za wyjaśnienia,
Pozdrawiam!
Pyton_000
Ilość funkcji ma jedynie wpływ na załadowanie ich do pamięci ergo zarezerwowany rozmiar pamięci.

Co do mysqli_ to bym się tym nie przejmował.
viking
Ja bym sie zastanowił nad http://php.net/manual/en/mysqli-result.fetch-object.php. nowe php potrafi być kilkukrotnie szybsze przy pracy nad obiektami nad tablicami.
nospor
@viking wzialem jakis na szybko test z netu

  1. $s = array();
  2. $time_start = microtime(true);
  3. for($x=0;$x<10000;$x++)
  4. {
  5. $s[] = array("name"=>"Adam","age"=>35);
  6. $s[$x]['name'];
  7. $s[$x]['age'];
  8. }
  9. echo memory_get_usage() - $sm . '<br />';
  10. $time_end = microtime(true);
  11. $time = $time_end - $time_start;
  12. echo $time . 's<br />';
  13.  
  14.  
  15.  
  16. $s = array();
  17. $time_start = microtime(true);
  18. for($x=0;$x<10000;$x++) {
  19. $o = new ArrayObject; $o->name = "Adam"; $o->age = 35; $s[] = $o;
  20. $s[$x]->name;
  21. $s[$x]->age;
  22. }
  23. echo memory_get_usage() - $sm . '<br />';
  24. $time_end = microtime(true);
  25. $time = $time_end - $time_start;
  26. echo $time . 's<br />';
  27.  
  28. $s = array(); class MyArrayObject {
  29. public $name, $age;
  30. public function __construct( $name, $age ) { $this->name = $name; $this->age = $age; }
  31. }
  32. $time_start = microtime(true);
  33. for( $x=0;$x<10000;$x++){
  34. $o = new MyArrayObject("Adam", 35 ); $s[] = $o;
  35. $s[$x]->name;
  36. $s[$x]->age;
  37.  
  38. }
  39. echo memory_get_usage() - $sm . '<br />';
  40. $time_end = microtime(true);
  41. $time = $time_end - $time_start;
  42. echo $time . 's<br />';

Wyniki dla php7.1
Kod
528440
0.00067687034606934s
6251320
0.0043520927429199s
1327880
0.0014209747314453s

Jak widac zarowno czasowo jak pamieciowo tablice sa zdecydowanie lepsze. Na drugim miejscu sa obiekty tworzone z gotowej klasy zas na koncu sa obiektu tworzone dynamicznie.

fetch_object() zwraca obiekty tworzone dynamicznie wiec teoretycznie wypadnie najgorzej. Jakies uwagi, komentarze? Chetnie podyskutuje na ten temat bo mnie interesuje smile.gif
Pyton_000
Panie kochany my tu mówimy o metodach BD a nie typach generycznych w porównaniu do obiektu biggrin.gif
Raczej coś w ten deseń ale dla mysqli_ i PDO
http://www.spearheadsoftwares.com/tutorial...ql-fetch-object
nospor
Panie rowniez kochany, z twojego arta
Cytat
. mysql_fetch_object performance is justified as it returns objects instead of native arrays which will always bring in a better memory usages than any other kinds of output array

Czyli mowa o normalnych objects vs arrays. Z artykulu nie wynika nic, ze jakos magicznie inaczej podchodza tutaj do obiektow i tablic.
I tak, tez czytalem prace naukowe jak to obiekty sa lepsze pamieciowo od tablic, a tu prosze, zonk. Moze robie zle test?
viking
Nie bardzo widzę teraz link (na twitterze) ale był to test jednego z core doveloperów PHP, jakiś miesiąc temu robiony. Dla prostych obiektów, bez przeliczeń, zużycie pamięci było dla obiektu 4-6 mniejsze niż dla tablicy. W przypadku operacji jest to wynik jak dla tablic plus lekko narzut na alokację pamięci dla obiektu. Zresztą ostatnio sporo grzebią w VM i widać znaczne poprawy.
nospor
@viking ja tez widzialem tego typu testy, teorie i ladnie opisane dlaczego obiekty sa lepsze od tablic. Dzis jednak chcialem to sprawdzic w praktyce i zonk. Nie wierze ze moja wersja php jest jakos specjalna wink.gif

Jedyne co sie zgadza w moim tescie z tymi teoriami to fakt,ze dynamiczne obiekty wypadaja o wiele gorzej od tych z gotowych klas
viking
https://3v4l.org/NOL3E/perf#output

Po tym widać jak najnowsze wersje php dostają po dupie w wydajności. Przykładowo dla 7.0.14

Kod
4288384<br />0.0068209171295166s<br />6251264<br />0.0039088726043701s<br />1327824<br />0.0019130706787109s<br />
Xeer
Czyli z tego co rozumiem, nie ma określonych reguł i znaczenie mają wersje PHP i (być może) moc maszyny na której znajduje się serwer WWW.
Czy może ja coś źle zrozumiałem z tego wszystkiego?
Ponieważ jak tak analizuję, u jednej osoby szybciej działa metoda a, u drugiej metoda b, a to jedna osoba wypowiada się, że PHP7 dostaje po dupie od PHP5...

Ogółem rzecz biorąc nie byłem dotychczas pozytywnie przekonany do PHP7 i jak na razie chyba nadal zostanę przy 5-tce.

Co do testów - nie powiem, całkiem ciekawe.
Szkoda jednak, że sam nie mogę ich sprawdzić dokładnie na własnej skórze, ponieważ mój hosting potrafi za 1 razem załadować coś przykładowo w 50ms, raz w 200ms a raz w 500ms - sam chciałem parę testów przeprowadzić no ale z takim hostingiem który posiadam niestety średnio jest to możliwe.

Ale dziękuję za dobrą konwersację, z pewnością nie raz jeszcze zajrzę do tego wątku wink.gif

Pozdrawiam.
nospor
Cytat
a to jedna osoba wypowiada się, że PHP7 dostaje po dupie od PHP5...

Ogółem rzecz biorąc nie byłem dotychczas pozytywnie przekonany do PHP7 i jak na razie chyba nadal zostanę przy 5-tce.
Osoba, ktora to ci powiedziala bredzi. php7 w porownaniu do php5 to torpeda. Byc moze troche zwalnia z kolejnymi wydaniami php7 ale nadal jest zdecydowanie szybsze i lepsze od php5. Zostawanie teraz z php5 to cofanie sie.
Xeer
Cytat(nospor @ 11.05.2017, 19:14:58 ) *
Osoba, ktora to ci powiedziala bredzi. php7 w porownaniu do php5 to torpeda. Byc moze troche zwalnia z kolejnymi wydaniami php7 ale nadal jest zdecydowanie szybsze i lepsze od php5. Zostawanie teraz z php5 to cofanie sie.


A co z przykładem który podał pan viking?
https://3v4l.org/NOL3E/perf#output

Wyraźnie PHP5 szybciej się wykonuje w tym przykładzie niż PHP7.
Pyton_000
Zdecydowanie nie warto zostawać przy 5, tym bardziej że z końcem przyszłego roku kończy definitywnie swój żywot i zostaje wsparcie tylko dla 7.

Ww. test u mnie wygląda tak:

Kod
→ php test.php => php 7
0.062088012695312                                                                                                                                                                                                              

→ dco exec --user application web php test.php => php 5.6
0.074342012405396


dla kodu:
  1. <?php
  2. $start = microtime(true);
  3. class Foo {
  4.  
  5. public $a;
  6.  
  7. }
  8.  
  9. $foos = array();
  10. for ($i = 100000; $i--;) {
  11. $foo = new Foo;
  12. $foo->a = 1;
  13.  
  14. $foos[] = $foo;
  15. }
  16.  
  17. echo microtime(true) - $start;
nospor
Cytat
A co z przykładem który podał pan viking?

Nie mam bladego pojecia jak dziala stronka, na ktorej testowal to viking, ale dziala zle wink.gif wg tej stronki php7 jest niesamowicie wolne w kazdej wersji

specjalnie dla ciebie odpalilem moj test na php5. Oba php chodza na tej samej maszynie z takim samym obciazeniem.
Oto czasy dla php5
Kod
5891656
0.011223077774048s
10234536
0.022026062011719s
3255624
0.01256799697876s

Jak widac golym okiem wyniki sa totalnie gorsze
viking
Co ja mówiłem to że ostatnie wydania PHP 7.1 są skopane i zdecydowanie szybciej ten kod wykonuje się na stabilnych 7.0. Znudziło mi się trochę śledzenie grupy PHP internals ale dopoki to robiłem nawet raporty z buiklów to potwierdzały. W PHP 7.0 przepsano od nowa algorytm odpowiedzialny za obsługę tablic, dlatego w porównaniu do v5 są kilkukrotnie szybsze. Kod nospora można wrzucić do jakiegokolwiek sandboxa online i sobie porównać.
nospor

Cytat
Co ja mówiłem to że ostatnie wydania PHP 7.1 są skopane i zdecydowanie szybciej ten kod wykonuje się na stabilnych 7.0.
Wg. testu co pokazales wynika, ze i php7.0 dziala wolniej od php5. Dlatego tez srednio ufam stronce, na ktorej to testowales. Ot i tyle smile.gif
viking
Strona uruchamia tylko kod na różnych wersjach parsera i podaje wyniki. To pokazuje tylko że nie ma się za bardzo co przejmować wydajnością bo każda wersja PHP się różni - w jednej coś zepsuto i nagle jest wolniej niż to było wcześniej. Z drugiej strony ewolucja oprogramowania, choćby na przykładzie systemów operacyjnych pokazuje, że to wcale nie jest takie głupie. Niby jest coraz szybszy sprzęt - n-rdzeniowe i wątkowe CPU, dyski NVMe itp, a ze względu na coraz więcej funkcji wcale to nie działa szybciej.
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.