Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wydajość przy połączeniach
halfik
post
Post #1





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 17.05.2003
Skąd: Nysa

Ostrzeżenie: (10%)
X----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
spenalzo
post
Post #2





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

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


[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]
Go to the top of the page
+Quote Post
hawk
post
Post #3





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


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ń (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
dooshek
post
Post #4





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 22.10.2003
Skąd: Trójmiasto

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


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]
Go to the top of the page
+Quote Post
jaco
post
Post #5





Grupa: Zarejestrowani
Postów: 115
Pomógł: 1
Dołączył: 15.01.2003

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


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





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


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





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 17.05.2003
Skąd: Nysa

Ostrzeżenie: (10%)
X----


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





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 30.01.2004
Skąd: Kraków, Częstochowa

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


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





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 17.05.2003
Skąd: Nysa

Ostrzeżenie: (10%)
X----


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ą (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
hawk
post
Post #11





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


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.

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





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


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





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 17.05.2003
Skąd: Nysa

Ostrzeżenie: (10%)
X----


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?
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: 25.12.2025 - 02:49