Luneth
14.08.2010, 13:44:54
Znalazłem ostatnio taki
artykuł. Jeśli dobrze zrozumiałem autora, to gdziekolwiek nie zastosujemy referencji to zwiększy nam to wydajność.

Pytanie jak się ma to do rzeczywistości? Myślałem, że referencje po prostu są takimi aliasami do tej samej wartości, bo wskaźnikami nie są, a gdyby były to chyba wówczas można by mówić o wzrostach wydajności. Kiedy w ogóle warto stosować referencje? Określmy, że środowiskiem naszej problematyki jest bardziej rozbudowany kod obiektowy (powiedzmy framework)? Pomijam przykłady z manuala, typu zmienianie wartości zmiennej przez funkcję bez zwracania jej wartości
230005
14.08.2010, 13:52:40
Stosuj tam gdzie chcesz aby funkcja "zwróciła dwie lub więcej wartości". Co do wydajności - struktury, które zajmują najwięcej pamięci - obiekty - i tak są przekazywane przez referencję. Myślisz, że jeśli do funkcji przekażesz jakiegoś integera przez referencję, to w widzialny sposób odbije się to na szybkości działania skryptu? Ok, jeśli powiedzmy masz jakąś przeogromną tablicę, to faktycznie możesz ją przekazać przez referencję...
Autor podanego wpisu się myli. Referencje nie tylko nie przyspieszają, ale i mogą spowolnić wykonywanie skryptu, jeśli stosujemy je wyłącznie do przyspieszania. Interpreter PHP stosuje leniwe kopiowanie, tj. tworzy fizyczną kopię wartości dopiero wtedy, gdy ma być ona zmieniona. Jeżeli funkcja nie modyfikuje oryginalnej wartości, żadne kopiowanie nie będzie mieć miejsca, zatem stosowanie referencji do "niewykonywania kopiowania" nie ma żadnego uzasadnienia.
Crozin
14.08.2010, 14:00:38
Cytat
Stosuj tam gdzie chcesz aby funkcja "zwróciła dwie lub więcej wartości".
Wtedy zwraca się tablicę/obiekt.
Kiedy stosować referencje: gdy ich właściwości są Ci potrzebne. Raczej na wydajność nie musisz patrzeć (patrz post Zyxa).
230005
14.08.2010, 16:06:29
Crozin: albo (bo wygląda na to, że jest taka możliwość) możesz po prostu użyć referencji

.
dr_bonzo
14.08.2010, 20:21:44
Jak ja używam referencji:
1. Przy obiektach nie mam wyboru (i to jest zaleta, w porownaniu do koszmaru z php4, gdzie w praktyce zawsze musiałbyś wymuszać referencje)
2. Nie używam chyba, że pkt 3
3. Uzywam tylko dla tablic które przekazuję do innych funkcji które je modyfikują, dodają nowe elementy (tu można by array_merge użwać) itp.
Np. funkcja walidująca pola, dokłada do tablicy komunikaty błędów, i jednocześnie zwraca booleana stwierdzającego czy walidacja przeszła czy nie. Oczywiście można było zwracać tablicę z 2ma elementami - bool i array zamiast użyć referencji.
Ogólnie - w systemie na >1000 klas moich, referencji użytych zostało < 50 (część pochodzi ze starych klas naszych libów - i używa ref. dla obiektów).
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.