Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wydajość przy połączeniach
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
halfik
Pierwsze moje pytanie: czy robił ktoś pomiary wydajności połączęń z mysql'em. Chodzi mi o to, czy lepiej jest aby każdy moduł w razie potrzeby otwierał dla siebie połączenie i je zamykał, czy może lepszym rozwiązaniem będzie: nawiazanie połączenia, wywołanie wszystkich funkcji operujacych na bazie, zamknięcie połączenia?

Moje drugie pytanie: chodzi o zwracanie referencji poprzez funkje. To daje efekt tylko w przypadku gdy funkcja zwraca np. bardzo dużą tablicę (zyskujemy czas, który normalnie stracilibyśmy na przekopiowanie danych z jednego miejsca w pamięci do innego) - chodzi o o "odczuwalny" efekt?

No to chyba na tyle z tego o co chciałem zapytać, a o czym nie zapomniałem winksmiley.jpg
spenalzo
[quote]Pierwsze moje pytanie: czy robił ktoś pomiary wydajności połączęń z mysql'em. Chodzi mi o to, czy lepiej jest aby każdy moduł w razie potrzeby otwierał dla siebie połączenie i je zamykał, czy może lepszym rozwiązaniem będzie: nawiazanie połączenia, wywołanie wszystkich funkcji operujacych na bazie, zamknięcie połączenia?[/quote]
Wielokrotne wywołane mysql_connect powoduje i tak otwarcie jednego zapytania - a zamykać nie musisz, bo połaczenie jest zamykane po wykonaniu skryptu.[/quote]
hawk
Cytat
Moje drugie pytanie: chodzi o zwracanie referencji poprzez funkje. To daje efekt tylko w przypadku gdy funkcja zwraca np. bardzo dużą tablicę (zyskujemy czas, który normalnie stracilibyśmy na przekopiowanie danych z jednego miejsca w pamięci do innego) - chodzi o o "odczuwalny" efekt?

Na temat referencji istnieje niestety mnóstwo nieporozumień sad.gif . Więc może należy napisać wyraźnie:
Note that php 4 is not like C: passing variables by reference is not necessarily faster than passing them by value. Indeed, in php 4 it is usually better to pass a variable by value, except if the function changes the passed value (ze strony Zenda, pełen artykuł http://www.zend.com/zend/art/ref-count.php).
php nie tworzy kopii obiektu przy przekazywaniu by value. Wprowadzanie referencji ze względów wydajnościowych nie jest uzasadnione.
dooshek
Cytat
Wprowadzanie referencji ze względów wydajnościowych nie jest uzasadnione.


Jak to nie? A przyklad:

[php:1:8915026597]
<?
// Jakis wielki hash
$wielkihash = array(
...
);

// I teraz zalozmy, ze musimy miec 2 zmienna ktora trzyma takiego hasha
$drugihash = &$wielkihash;

// Przyklad ze Smartym
// Jesli zrobimy zwykle assign() to zostanie zrobiona kopia wielkiegohasha
// a jesli assign_by_ref to zostanie przekazana tylko jego referencja
$smarty->assign_by_ref('wielkihash', $wielkihash)

?>
[/php:1:8915026597]
jaco
Cytat
Wielokrotne wywołane mysql_connect powoduje i tak otwarcie jednego zapytania - a zamykać nie musisz, bo połaczenie jest zamykane po wykonaniu skryptu.


Niestety teoria teoria a praktyka praktyka - okazuje sie, ze przy duzym obciazeniu czesc polaczen nie jest zamykana, konsekwencje sa oczywiste.

Zdecydowanie szybciej/lepiej na poczatku skryptu sie polaczyc z baza i z tego jednego polaczenia korzystac (to chyba, ze potrzebujemy innego do innej bazy czy serwera), na koniec skryptu je zamknac.
hawk
Cytat
// Jesli zrobimy zwykle assign() to zostanie zrobiona kopia wielkiegohasha
// a jesli assign_by_ref to zostanie przekazana tylko jego referencja
$smarty->assign_by_ref('wielkihash', $wielkihash)

Tak? Sprawdzałeś? A czytałeś w ogóle artykuł który wskazałem? Twórcy silnika php twierdzą że kopia nie zostanie stworzona. No ale może oni się mylą...

Dla zainteresowanych, kilka testów:
http://www.blueshoes.org/phpBench.php
http://codewalkers.com/forum/index.php?act...8&realm=default

Ja u siebie sprawdzałem swego czasu na 5MB stringu. Zero różnicy.
halfik
Cytat
Ja u siebie sprawdzałem swego czasu na 5MB stringu. Zero różnicy.


Hmm... ja tetowalem skrypty z mojej stronki, pod które jest podpięte 9-21 funkcji (do każdego głownego). Do wszystkich funkcji zrobiłem referencję na wejście, a później tylko zwrotna, a na koniec obydwie.

Istotnie przy małym obciążeniu straty czasowe w 1 i 2 przpadku były rzędu 1.5-3.5%. Ale już przy 10 symulowanych połączeniach + 1000 żądań okazało się, że zyskałem średnio 4.3% (przy niektórych skryptach nawet więcej - tam gdzie występowały tablice na wejsciu lub wyjściu: 15%). Generalnie z pomiarów wynikało, że sporo zysku daje ref. zwrotna (większośc moich funkcji zwraca tablice małych rozmiarów). Ref. na wejscie daje jak wspomniałem zależnie od obciążenia serwera... ale zawsze mamy jakiś zysk. Problem w tym, że trzeba by tutaj nie zastanawiać się nad tym czy opłaca się użyć ref. czy też nie. Wg. mnie referencji trzeba używać zawsze jeśli przewidujemy, że pisana stronka będzie monco obciążona, a w przeciwnym wypadku opłaca się istotnie tylko przy tablicach. Przynajmniej tak wynika z przeprowadzonych przeze mnie pomiarów.
DeyV
Twórcy php twierdzą, że w tej chwili referencji należy używać tylko w przypadku przesyłania obiektów, gdzie dzięki temu unikamy stworzenia kopi obiektu.
W innych przypadkach różnic w prędkości działania być nie powinno - co wiecej - w pewnych przypadkach ponoć tworzenie referencji potrafi być nawet wolniejsze.
Jest to o tyle dziwne, że przecież - podczas kopiowania tablicy w rzeczywistośmy musi ona zajmować więcej pamięci. Najprawdopodobniej więc problem polega na tym, że w rzeczywistośc referencja nie jest w tej chwili napisana optymalnie.
Z tego co wiem, jedną z podstawowych zmian (oczywiście poza wprowadzeniem nowych elementów, np OOP), jakie przeszedł szkielet php5, jest własnie poprawa obsługi przesyłąnia i kopiowania, oraz tworzenia referencji zarówno tablic jak i obiektów.
Tak więc za jakiś czas, jak tylko php zacznie nam oficjalnie sponsorować cyferka 5, warto będzie zweryfikowac swoje poglądy, i ponownie to sprawdzić....
Holyboy
Cytat
Z tego co wiem, jedną z podstawowych zmian (oczywiście poza wprowadzeniem nowych elementów, np OOP), jakie przeszedł szkielet php5, jest własnie poprawa obsługi przesyłąnia i kopiowania, oraz tworzenia referencji zarówno tablic jak i obiektów.

W PHP5 obiekty beda domyslnie przekazywane przez referencje.
Malutka uwaga - wyliczanie OOP jako nowosci w PHP5 jest lekko nietrafne, 'rozszerzenie' to bardziej precyzyjne okreslenie (prosze mi wybaczyc, ze czepiam sie takiego szczegoliku, byc moze zabraklo 'w' przed OOP).
halfik
Cytat
Malutka uwaga - wyliczanie OOP jako nowosci w PHP5 jest lekko nietrafne, 'rozszerzenie' to bardziej precyzyjne okreslenie (prosze mi wybaczyc, ze czepiam sie takiego szczegoliku, byc moze zabraklo 'w' przed OOP).

Ja bym tutaj dyskutował, bo tego co jest w 4 raczej nie można nazwać obiektowością. To jest raczej dożucenie czegoś co by chociaż wyglądało jak OOP na sam koniec projektu, bo okazało się że czasy tego wymagają winksmiley.jpg
hawk
Cytat
Jest to o tyle dziwne, że przecież - podczas kopiowania tablicy w rzeczywistośmy musi ona zajmować więcej pamięci. Najprawdopodobniej więc problem polega na tym, że w rzeczywistośc referencja nie jest w tej chwili napisana optymalnie.

aaevil.gif Ale o to właśnie chodzi, że wg. oficjalnych źródeł w przypdku nie używania referencji zmienna nie jest kopiowana, dopóki nie musi.
Ciągle słyszę, że należy stosować referencje, ponieważ unikamy tworzenia niepotrzebnych kopii. A tak nie jest. Natomiast wyniki testów są różne - w jedynch sytuacjach referencje będą szybsze, w innych wolniejsze. A jeden z przykładów podanych przeze mnie pokazywał, że użycie referencji prowadzi to tworzenia niepotrzebnych kopii smile.gif
DeyV
[quote]wyliczanie OOP jako nowosci w PHP5 jest lekko nietrafne,[/quote]
racja. Miało być:
[quote]nowych elementów, np [b]w

[quote]oficjalnych źródeł w przypdku nie używania referencji zmienna nie jest kopiowana, dopóki nie musi. [/quote]
Wiem.
I to jest ciekawe. Co prawda moja znajomośc c++ jest co najmniej marna, a już na pewno nie na tyle dobra, żeby mieć szanse na wgryzanie się w jądro php, ale temat jest conajmniej interesujący. W jaki sposób radzą sobie z wersjonowaniem zmiennych? Tj. jak długo może to być jedna instancja, jedna przestrzeń pamięci, a kiedy konieczne jest utworznie kopi.
hawk
Wg Zenda kopia fizyczna robiona jest dopiero wtedy, gdy zmieniamy coś w jednej z "kopii". Do tej pory obie zmienne używają tak naprawdę tego samego obszaru pamięci.
halfik
Cytat
...Natomiast wyniki testów są różne - w jedynch sytuacjach referencje będą szybsze, w innych wolniejsze.

hmm... możliwe, że na rożne wyniki pomiarów wpływa sprzęt, na którym były one robione. Przemyślałem sprawe i faktycznie wyniki moga być różne. Ja pomiary robiłem na Celeronie 400 z 64 RAMu, co przy obciążeniu serwa 10 połączeniami szybko kończyło się na mocnym swapowaniu. Prawdopodobne gdybym miał z 512 RAMu wyniki pomiarów byłyby odwrotne. Chodzi mi o to, że w momencie gdy wsadziłem referencje gdzie tylko się dało zamiast robić kopie zmiennych, potrzebowałem znacznie mniej pamięci, a co jest zgodne nie tylko z teorią, ale równierz z zauważonym przeze mnie obciążeniem pamięci wirtualnej - bez referencji mocne swapowanie zaczynało się wcześniej i de facto wsysało dużo więcej miejsca dyskowego.

Ja bym obstawiał, że mimo wszystko referencja daje zysk, ale żeby to zauważyc trzeba mieć takiego trupa (Celeron 400) jak ja, bo przy nowych P4 z ich ilością RAMu to istotnie może być nimożliwe. Co sądzicie?
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.