Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Argument funkcji a wydajność?, Ograniczony vs pełne dane
-lukasamd-
post
Post #1





Goście







Witam,
ostatnio zaintrygowało mnie jedno pytanie - jak się ma do wydajności argument przekazywany do funkcji?

Powiedzmy sobie, że mam coś takiego:

  1. function my_function($arg)
  2. {
  3. $id = $arg['id'];
  4. // Tutaj cos sie dzieje z uzyciem id
  5. }
  6.  
  7.  
  8. $arg = array();
  9.  
  10. // Tu trafiaja do $arg dane, np. z bazy
  11.  
  12.  
  13. $var = my_function($arg);


Funkcja, do której przekazuję w argumencie tablicę. Z tej tablicy potrzebuję jednak tylko id, a więc w sumie lepsze wydaje się to:

  1. function my_function($arg)
  2. {
  3. // Tutaj cos sie dzieje z uzyciem arg
  4. }
  5.  
  6. $arg = array();
  7.  
  8. // Tu trafiaja do $arg dane, np. z bazy
  9.  
  10.  
  11. $var = my_function($arg['id']);


No ale czasami zachodzi potrzeba użycia czegoś z tablicy poza tym id... sporadycznie ale jednak.
Jak wygląda porównanie obu tych sposobów pod względem wydajności?

Czy po zwróceniu wartości automatycznie argumenty przekazywane do funkcji są niszczone (lokalnie wewnątrz funkcji), czy ma to jakiś konkretny wpływ na działanie?

Ten post edytował lukasamd 16.06.2010, 17:37:23
Go to the top of the page
+Quote Post
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Zdaje mi się, że w PHP5 nie ma to większego znaczenia bo są przekazywane jako referencje.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
-lukasamd-
post
Post #3





Goście







Sprawdziłem taki kod:
  1. function my_function($arg)
  2. {
  3. $arg['id'] = 0;
  4. return false;
  5. }
  6.  
  7.  
  8. $arg['id'] = 2;
  9.  
  10. my_function($arg);
  11.  
  12. echo $arg['id'];


No i wyświetla 2, a więc modyfikacja wewnątrz funkcji nie wpływa na argument globalnie, a więc i dane wewnątrz funkcji są kopiowane czy coś takiego (tak czy inaczej, nie jest to referencja).
Jeżeli dam global lub podam argument &$arg to oczywiście wtedy wyświetla 0.
Go to the top of the page
+Quote Post
Fifi209
post
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Referencje automatycznie, gdy przypisujemy obiekt - moje niedoczytanie jakieś haha.gif A tak to ręcznie musisz chyba ;]
Wrzuć w pętlę np. 10 tyś razy, wyciągnij średnią lub medianę z czasów i będziesz wiedział.

Ten post edytował fifi209 16.06.2010, 19:22:48


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Takie coś nie ma wpływu na wydajność... albo inaczej: takim czymś powinieneś się zająć dopiero w momencie, gdy ma to wpływ na ową wydajność, czyli prawdopodobnie nigdy.

Lepiej zastanów się kiedy Twoja funkcja jest bardziej logiczna: gdy przyjmuje konkretny argument (id) czy całą tablicę argumentów.
Go to the top of the page
+Quote Post
thek
post
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Jeśli do jakiejś funkcji pchamy argument, to jest tworzona jego kopia lokalna dostępna dla tejże funkcji i nie ma ona wpływu na globalną wartość argumentu. Funkcja działa na kopii. A to oznacza, że jest to trochę wolniejsze, gdyż trzeba utworzyć kopię, zrobić coś na niej i na koniec jeszcze jest ona niszczona. Im większy argument lub ich więcej tym ciut dłuższe tworzenie, operowanie i usuwanie. Nie jakoś bardzo znacząco, ale użycie referencji w pewnych wypadkach pozwala te ułamki sekund oszczędzić. Zwłaszcza w przypadku operacji na dużych zestawach danych. Oczywiście musimy być świadomi tego co się dzieje w kodzie, by nie było niespodzianek: "Czemu mi się zmienia wartość zmiennej, skoro nie chcę?". Ale z czasem sam dochodzisz do tego co gdzie stosować. Kwestia obycia, otrzaskania z kodem i analizą tego co ma on robić.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Zyx
post
Post #7





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


PHP posiada coś takiego, jak leniwe kopiowanie, tj. faktyczna kopia wykonywana jest dopiero wtedy, gdy dane mają być zmienione. Jeśli pchasz jakąś wartość jedynie do odczytu, zachowuje się to tak, jak w przypadku referencji... z tego właśnie powodu używanie referencji do optymalizowania skryptów w PHP mija się z celem smile.gif.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
thek
post
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Jeśli do odczytu to owszem, ale zazwyczaj jest tak, że pchając coś jako argument operujesz na nim i potem go zwracasz już zmieniony, choć często nie chce się przy tym tykać oryginału, który ma służyć jeszcze jakimś operacjom. Wtedy kopię utworzy i tak. Jeśli oryginał jest nieistotny to warto rozważać wtedy referencje, bo jednak jakiś tam drobny zysk uzyskamy. Ale jak już wspomniałem, nie są to astronomiczne wartości i rozważa się na tym poziomie zmiany już raczej w sytuacjach gdy mocno nam zależy na optymalizacji, choćby ułamków sekund. tak jak optymalizacją jest odwrócenie biegu pętli. Nie od 0 do określonej wartości, ale od tejże wartości do 0 (gdy wartość licznika jest nieważna lub mało istotna) smile.gif Kto nie wierzy niech sprawdzi, bo w pewnych językach (choćby JavaScript) takie optymalizacje są skuteczne, choć nie spodziewa się człowiek, że mają jakikolwiek wpływ na wydajność.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
jajcarzd1
post
Post #9





Grupa: Zarejestrowani
Postów: 215
Pomógł: 19
Dołączył: 24.12.2003
Skąd: Przemyśl

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


Kiedyś też często przekazywałem dane skalarne referencyjnie dodając & w argumencie, aż odpaliłem kiedyś tak przypadkiem opcję Analyze Code w Zend Studio i przy funkcjach gdzie następował tylko odczyt argumentu a nie jego modyfikacja Zend sugerował wywalenie referencji. A dokladniej mówi tak



dlatego jeśli nie przypisujemy jej nic nowego to referencji nie ma co używać, no chyba że jest to obiekt to wiadomo że w PHP5 poleci referencyjnie. Natomiast to czy przekazywać np całą tablicę czy tylko jej element to szczerze mówiąc ciekawe pytanie. Ale nie sądze by była tu jakaś znacząca różnica bo i tak w którymś momencie musisz się odwołac do jej indeksu.


--------------------
My mind is glowing ...
Jeśli pomogłem push the button :)
Go to the top of the page
+Quote Post
-lukasamd-
post
Post #10





Goście







Ok, dzięki wszystkim za pomoc i wytłumaczenie tematu winksmiley.jpg
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 20:56