Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy taki wynik generowania i RAMu to dobry wynik?
Forum PHP.pl > Forum > Gotowe rozwiązania
Weles
Witam!

Piszę własne Forum od kilku miesięcy, i zastanawia mnie czy pobieranie zasobów przez moje forum jest duże jak na forum, czy małe.

http://mpgw.pl

Na samym dole nad stopką macie czas wygenerowania i pobierany RAM:

Strona wygenerowana w: 15.69 milisekund (0.016s)
Wczytując stronę, serwer użył: 0.41 MB RAM

Prosiłbym o opinię od was czy to dużo jak na forum czy mało.
Pozdrawiam!
Sephirus
Co do czasu - to jest bardzo bardzo dobry czas smile.gif (aż dziwne)

W sumie czas zależy w dużej mierze nie tylko od samego PHP ale od czasu łączenia z bazą, wykonywania zapytań (a zatem ich optymalizacji itd...) i uzyskanie czas rzędy < 20ms powinno być raczej mało prawdopodobne smile.gif (chyba że to wszystko jest cache'owane).

Do tego dochodzi też kwestia liczby użytkowników online - im więcej tym więcej oczekiwań na różne rzeczy - także w bazie danych i czas rośnie.

Moim zdaniem czas < 50ms na generowanie porządnej strony to super czas. Twój zatem jest bardzo dobry (o ile jest dobrze liczony) smile.gif

Co do zajmowania pamięci RAM - 0,5MB to dziwnie mało i to dobry rezultat - pamiętaj jedynie o tym, że ciężko jest go dokładnie określić.

Ogólnie więc: jak na forum to baaaaardzo dobry rezultat - porządny - pochodziłem nieco i czas wacha się od ~10ms do ~70ms w zależności od typu podstrony - a to dobrze. Zastanawia mnie jedynie ta pamieć bo jest jej mało smile.gif

Jeżeli testy są realne to jest GIT wink.gif
Weles
Cytat(Sephirus @ 1.06.2012, 10:01:58 ) *
Co do czasu - to jest bardzo bardzo dobry czas smile.gif (aż dziwne)

W sumie czas zależy w dużej mierze nie tylko od samego PHP ale od czasu łączenia z bazą, wykonywania zapytań (a zatem ich optymalizacji itd...) i uzyskanie czas rzędy < 20ms powinno być raczej mało prawdopodobne smile.gif (chyba że to wszystko jest cache'owane).

Do tego dochodzi też kwestia liczby użytkowników online - im więcej tym więcej oczekiwań na różne rzeczy - także w bazie danych i czas rośnie.

Moim zdaniem czas < 50ms na generowanie porządnej strony to super czas. Twój zatem jest bardzo dobry (o ile jest dobrze liczony) smile.gif

Co do zajmowania pamięci RAM - 0,5MB to dziwnie mało i to dobry rezultat - pamiętaj jedynie o tym, że ciężko jest go dokładnie określić.

Ogólnie więc: jak na forum to baaaaardzo dobry rezultat - porządny - pochodziłem nieco i czas wacha się od ~10ms do ~70ms w zależności od typu podstrony - a to dobrze. Zastanawia mnie jedynie ta pamieć bo jest jej mało smile.gif

Jeżeli testy są realne to jest GIT wink.gif


Mi się wydaje że dobrze liczę, ale jeśli się znasz to może ocenisz czy dobrze to zrobiłem, skoro:

1 megabajt = 1 048 576 bajtów

A "memory_get_usage()" podaje wynik w bajtach, to zrobiłem: "memory_get_usage()/1048576" - to moim zdaniem powinno wyjść w MB czas, prawda?

Obliczenie 1 megabajta na bajty: https://www.google.pl/search?sugexp=chrome,...gabajt+na+bajty

A czas ładowania zrobiłem tak:

  1. function generowanie_strony(){
  2. list($uzytk, $sekundy) = explode(" ", microtime());
  3. return((float)$uzytk+(float)$sekundy);
  4. }


Następnie na samym początku strony dałem:
  1. $rozpoczecie = generowanie_strony();


I na samym końcu strony:
  1. $zakonczenie = generowanie_strony();


I TOTALNIE na końcu obliczyłem wynik tak:
  1. if($czas_generowania >= 1) {
  2. $czas_generowania=round($czas_generowania, 5).' sekund';
  3. } elseif($czas_generowania < 0.1) {
  4. $czas_generowania=(round($czas_generowania, 5)*1000).' milisekund ('.round($czas_generowania, 3).'s)';
  5. }

Obliczenie sekundy na milisekundy: https://www.google.pl/search?sugexp=chrome,...a+na+milisekund

Wszystko się zgadza ?

Pozdrawiam.
Sephirus
Ogólnie jest ok wink.gif

Aby mieć pewność co do tego ile to zjada pamięci powinieneś pobawić się 3 rzeczami jakie daje PHP samo w sobie (bez dodatkowych xDebug'ów itd ;P)

1. memory_get_usage() i memory_get_usage(true)

To podaje ile pamięci zużywa skrypt w momencie, w którym ta funkcja jest wywoływana.

Zatem jeśli dasz:

  1.  
  2. echo memory_get_usage() // powiedzmy że daje ~1MB
  3.  
  4. $zmienna = 'załóżmy że jest to ciąg zajmujący w pamięci 2MB';
  5.  
  6. unset($zmienna);
  7.  
  8. echo memory_get_usage() // teraz znowu da ~1MB - a naprawdę zużywałeś w pewnej chwili ~3MB ;)


Zatem dawanie memory_get_usage na końcu mówi jedynie ile pamięci jest używane na końcu skryptu - co nie do końca jest prawdziwe jeśli chodzi o cały przebieg skryptu.

Dodatkowy parametr (true) pozwala na dokładniejsze określenie użytej pamięci w danej chwili

WNIOSEK: memory_get_usage nadaje się do sprawdzania stanu pamieci w danej chwili - nie na końcu.

2. memory_get_peak_usage() i memory_get_peak_usage(true)

To rozwiązuje powyższy problem smile.gif

  1.  
  2. echo memory_get_peak_usage() // powiedzmy że daje ~1MB
  3.  
  4. $zmienna = 'załóżmy że jest to ciąg zajmujący w pamięci 2MB';
  5.  
  6. unset($zmienna);
  7.  
  8. echo memory_get_peak_usage() //to da ~3MB - bo tyle było w tzw piku czyli wartość maksymalnego użycia pamięci do momentu wywołania tej funkcji


Ta funkcja zwraca maksimum zużycia pamięci w momencie wywołania ale bierze pod uwagę cały skrypt - jesli zatem wykonasz ją na końcu - otrzymasz realną wartość użytej pamięci (maksimum)

3. memory_set_limit

jeżeli chcesz mieć pewność że dany skrypt nie przekracza danej wartości pamięci (powiedzmy 1MB) możesz ustalić 1MB jako limit (tylko w ramach testowania) i następnie używać skryptu i sprawdzać czy "nie wypluję" błędu związanego z przekroczeniem limitu pamięci wink.gif

Podsumowując jeśli sprawdzasz pamięc na końcu to użyj memory_get_peak_usage i wyświetl to dla podania argumentu "true" i bez - wtedy wyniki mogą (choć nie muszą kształtować się inaczej wink.gif
irmidjusz
Cytat(Weles @ 1.06.2012, 10:06:40 ) *
  1. if($czas_generowania >= 1) {
  2. $czas_generowania=round($czas_generowania, 5).' sekund';
  3. } elseif($czas_generowania < 0.1) {
  4. $czas_generowania=(round($czas_generowania, 5)*1000).' milisekund ('.round($czas_generowania, 3).'s)';
  5. }


A co z warunkiem 0.1 <= $czas_generowania < 1?
Weles
Cytat(Sephirus @ 1.06.2012, 10:39:18 ) *
Ogólnie jest ok wink.gif

Aby mieć pewność co do tego ile to zjada pamięci powinieneś pobawić się 3 rzeczami jakie daje PHP samo w sobie (bez dodatkowych xDebug'ów itd ;P)

1. memory_get_usage() i memory_get_usage(true)

To podaje ile pamięci zużywa skrypt w momencie, w którym ta funkcja jest wywoływana.

Zatem jeśli dasz:

  1.  
  2. echo memory_get_usage() // powiedzmy że daje ~1MB
  3.  
  4. $zmienna = 'załóżmy że jest to ciąg zajmujący w pamięci 2MB';
  5.  
  6. unset($zmienna);
  7.  
  8. echo memory_get_usage() // teraz znowu da ~1MB - a naprawdę zużywałeś w pewnej chwili ~3MB ;)


Zatem dawanie memory_get_usage na końcu mówi jedynie ile pamięci jest używane na końcu skryptu - co nie do końca jest prawdziwe jeśli chodzi o cały przebieg skryptu.

Dodatkowy parametr (true) pozwala na dokładniejsze określenie użytej pamięci w danej chwili

WNIOSEK: memory_get_usage nadaje się do sprawdzania stanu pamieci w danej chwili - nie na końcu.

2. memory_get_peak_usage() i memory_get_peak_usage(true)

To rozwiązuje powyższy problem smile.gif

  1.  
  2. echo memory_get_peak_usage() // powiedzmy że daje ~1MB
  3.  
  4. $zmienna = 'załóżmy że jest to ciąg zajmujący w pamięci 2MB';
  5.  
  6. unset($zmienna);
  7.  
  8. echo memory_get_peak_usage() //to da ~3MB - bo tyle było w tzw piku czyli wartość maksymalnego użycia pamięci do momentu wywołania tej funkcji


Ta funkcja zwraca maksimum zużycia pamięci w momencie wywołania ale bierze pod uwagę cały skrypt - jesli zatem wykonasz ją na końcu - otrzymasz realną wartość użytej pamięci (maksimum)

3. memory_set_limit

jeżeli chcesz mieć pewność że dany skrypt nie przekracza danej wartości pamięci (powiedzmy 1MB) możesz ustalić 1MB jako limit (tylko w ramach testowania) i następnie używać skryptu i sprawdzać czy "nie wypluję" błędu związanego z przekroczeniem limitu pamięci wink.gif

Podsumowując jeśli sprawdzasz pamięc na końcu to użyj memory_get_peak_usage i wyświetl to dla podania argumentu "true" i bez - wtedy wyniki mogą (choć nie muszą kształtować się inaczej wink.gif


Dawałem memory_get_peak_usage(true) oraz memory_get_usage(true) i oba bez, i wyniki są podobne, chodź troszkę inne.
Teraz dałem memory_get_peak_usage(true) i jest na http://mpgw.pl od:


Wczytując stronę, serwer użył: 0,5 MB RAM
do
Wczytując stronę, serwer użył: 1 MB RAM

U ciebie też tyle wyskakuje? bo nie wiem jak to działa, czy każdemu te same wyniki, czy od czego to tam zalezy ^^

Cytat(irmidjusz @ 1.06.2012, 10:40:02 ) *
A co z warunkiem 0.1 <= $czas_generowania < 1?


nie rozumiem?
Sephirus
Tak ogólnie wygląda na to że tyle właśnie zużywa twoja strona - to dobrze - teraz mamy 95% pewności smile.gif

jeżeli chcesz mieć 100% pewność możesz dać jeszcze to memory_set_limit('1M'); i czuwać czy gdzieś się nie wywali błąd wink.gif (ale nie zostawiaj tego dla użytkowników) możesz to uzależnić od jakiegoś ciasteczka itp...

Co do czasu jak wspomniał irmidjusz fakt coś tam chyba masz zamotane. Zawsze możesz użyć microtime(true) który zwraca czas w formie

12345.1234566

jako liczba zmienno przecinkowa - po odjęciu jednej od drugiej powinieneś dostać odpowiedni wynik.

Proponuje:

  1. $start = microtime(true);
  2.  
  3. // cały kod
  4.  
  5. echo number_format((microtime(true) - $start)*1000,1);


To Ci wyświetli czas generowania strony w milisekundach dając w formacie XXX.Y [ms]
Weles
Cytat(Sephirus @ 1.06.2012, 11:03:46 ) *
Tak ogólnie wygląda na to że tyle właśnie zużywa twoja strona - to dobrze - teraz mamy 95% pewności smile.gif

jeżeli chcesz mieć 100% pewność możesz dać jeszcze to memory_set_limit('1M'); i czuwać czy gdzieś się nie wywali błąd wink.gif (ale nie zostawiaj tego dla użytkowników) możesz to uzależnić od jakiegoś ciasteczka itp...

Co do czasu jak wspomniał irmidjusz fakt coś tam chyba masz zamotane. Zawsze możesz użyć microtime(true) który zwraca czas w formie

12345.1234566

jako liczba zmienno przecinkowa - po odjęciu jednej od drugiej powinieneś dostać odpowiedni wynik.

Proponuje:

  1. $start = microtime(true);
  2.  
  3. // cały kod
  4.  
  5. echo number_format((microtime(true) - $start)*1000,1);


To Ci wyświetli czas generowania strony w milisekundach dając w formacie XXX.Y [ms]


Twój kod zwraca mi tyle co mój czyli średnio 16.4ms,

Początek strony: $rozpoczecie = microtime(true);
Koniec strony: $zakonczenie = microtime(true);

Obliczenie wyniku: $czas_generowania = $zakonczenie-$rozpoczecie;

I wyświetlenie.

Więc mówisz że takie wyniki RAM i GENEROWANIA są dobre jak na forum?

@EDIT:
number_format wybija mi tylko liczbę całkowitą np "15", "16" bez po przecinku np. "15,6", "16,2" więc wolę jednak round, ale przyznam że twój sposób na obliczenie jest łatwiejszy bez zbędnej funckji smile.gif
irmidjusz
Co w sytuacji, gdy czas generowania jest większy bądź równy 0.1 i mniejszy od 1 - bo Twoje if-y, które zapodałeś, tego warunku nie uwzględniają.
Weles
Cytat(irmidjusz @ 1.06.2012, 11:13:02 ) *
Co w sytuacji, gdy czas generowania jest większy bądź równy 0.1 i mniejszy od 1 - bo Twoje if-y, które zapodałeś, tego warunku nie uwzględniają.


Ahm, rzeczywiście walnąłem mały błąd, dzięki za informację.
zamiast:
  1. if($czas_generowania >= 1) {
  2. $czas_generowania=round($czas_generowania, 5).' sekund';
  3. } elseif($czas_generowania < 0.1) {
  4. $czas_generowania=(round($czas_generowania, 5)*1000).' milisekund ('.round($czas_generowania, 3).'s)';
  5. }

powinno być:
  1. if($czas_generowania >= 1) {
  2. $czas_generowania=round($czas_generowania, 5).' sekund';
  3. } elseif($czas_generowania < 1) {
  4. $czas_generowania=(round($czas_generowania, 5)*1000).' milisekund ('.round($czas_generowania, 3).'s)';
  5. }


Dzięki za informację tongue.gif
Sephirus
No to wszystko wyjaśnione smile.gif

IMHO - staty są niezłe - chciałbym to zobaczyć jeszcze przy obciążeniu dużym (pamięć się nie zmieni ale czas powinien) smile.gif
Weles
Cytat(Sephirus @ 1.06.2012, 11:30:21 ) *
No to wszystko wyjaśnione smile.gif

IMHO - staty są niezłe - chciałbym to zobaczyć jeszcze przy obciążeniu dużym (pamięć się nie zmieni ale czas powinien) smile.gif


Ok, dzięki za pomoc i informację! smile.gif
Bardzo mi się przydały tongue.gif
Pozdrawiam.
irmidjusz
Cytat(Sephirus @ 1.06.2012, 11:30:21 ) *
IMHO - staty są niezłe - chciałbym to zobaczyć jeszcze przy obciążeniu dużym (pamięć się nie zmieni ale czas powinien) smile.gif


A ja bym chciał zobaczyć jak kolega napisał kod PHP tego forum, a nie czy się strona generuje w 10ms czy 100ms.
IMO to pierwsze jest ważniejsze. Optymalizacje to się robi gdy rzeczywiście potrzeba. Jakość kodu jest ważniejsza.
Mephistofeles
Jak to mówią: "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil"
Nie ma sensu przejmować się każdą milisekundą dopóki wszystko działa jak trzeba.
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.