Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 259 Pomógł: 0 Dołączył: 17.05.2003 Skąd: Nysa Ostrzeżenie: (10%)
|
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) |
|
|
|
![]() |
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] |
|
|
|
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. |
|
|
|
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] |
|
|
|
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. |
|
|
|
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. |
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 259 Pomógł: 0 Dołączył: 17.05.2003 Skąd: Nysa Ostrzeżenie: (10%)
|
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. |
|
|
|
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ć.... |
|
|
|
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). |
|
|
|
Post
#10
|
|
|
Grupa: Zarejestrowani Postów: 259 Pomógł: 0 Dołączył: 17.05.2003 Skąd: Nysa Ostrzeżenie: (10%)
|
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) |
|
|
|
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) |
|
|
|
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. |
|
|
|
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.
|
|
|
|
Post
#14
|
|
|
Grupa: Zarejestrowani Postów: 259 Pomógł: 0 Dołączył: 17.05.2003 Skąd: Nysa Ostrzeżenie: (10%)
|
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? |
|
|
|
![]() ![]() |
|
Aktualny czas: 25.12.2025 - 02:49 |