Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php-teoria] Używać referencji?
DeyV
post
Post #1





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




Zazwyczaj mówi się o tym, by przy przekazywaniu dużych paramatrów do funckji używać referencji. Też wydawało mi sie to rozsądne, mimo ostrzeżeń z tym zwiazanych zawartych w manualu.
Jednak ostatnio trafiłem na artykuł http://phplens.com/lens/php-book/optimizin...bugging-php.php Zobaczcie, do czego tam doszli.
Cytat
Do References Speed Your Code?

References do not provide any performance benefits for non-object variables. For example, consider the following code:

[php:1:9bf200aba9]<?php
function TestRef(&$a)
{
   $b = $a;
   $c = $a;
}
$one = 1;
ProcessArrayRef($one);
?>[/php:1:9bf200aba9]

And the same code without references:

[php:1:9bf200aba9]<?php
function TestNoRef($a)
{
   $b = $a;
   $c = $a;
}
$one = 1;
ProcessArrayNoRef($one);
?>[/php:1:9bf200aba9]

php does not actually create duplicate variables when "pass by value" is used, but uses high speed reference counting internally. So in TestRef(), $b and $c take longer to set because the references have to be tracked, while in TestNoRef(), $b and $c just point to the original value of $a, and the reference counter is incremented. So TestNoRef() will execute faster than TestRef().

In contrast, functions that accept object parameters have a performance advantage when references are used. This is because objects do not use reference counting, so multiple copies of an object are created if "pass by value" is used. So the following code:

[php:1:9bf200aba9]<?php
function ObjRef(&$o)
{
  $a =$o->name;
}
?>[/php:1:9bf200aba9]

is faster than:

[php:1:9bf200aba9]<?php
$function ObjRef($o)
{
 $a = $o->name;
}
?>[/php:1:9bf200aba9]
Note: In php 5, all objects are passed by reference automatically, without the need of an explicit & in the parameter list.

Czyli wynikałoby z tego, że zazwyczaj (nie mówię o obiektach) referencje nie są konieczne. Jak to ma się do Waszych doświadczeń?
Go to the top of the page
+Quote Post
Seth
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

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


Artykuł trochę mnie zaskoczył gdyż teoretycznie referencja zawsze powinna być szybsza niże przekazywanie przez wartość. Lecz wynika z tego, żę konstruktorzy php myśleli inaczej (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
W takim razie referencja rzeczywiście w przypadku gdy chcemy przyspieszyć przekazywanie zmiennych nie jest nam potrzebne (pomijam obiekty). Lecz całkowicie nie można z niej zrezygnować. Poza tym przyspieszeniem pozwala ona też na zwrócenie większej liczby zmiennych przez funkcje niż tylko jedną. Mozemy przecież podać zmienną jako parametr a potem po zmienienieu jej przez funkcje mamy cały czas w niej wynik.

Jeśłi chodzi o inne języki to nawet na zwykłych zmiennych jest to szybsze niż przekazywanie przez wartość.
Jednak dobry sty programowania nakazuje aby nie nadawać zbyt dużych praw do zmiennych i nie liczyć, że przekazując zmienną przez referencje ona się nie zmieni. Dlatego jest pewien sposób, otóz zmienna przekazywana przez referencje do funkcji staje się także contans.
Przykład w C++ :
Kod
(...)

int przez_ref( const int &zmienna ){

(...)

}
Go to the top of the page
+Quote Post
DeyV
post
Post #3





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




Z drugiej strony w wielu jezykach tablice zawsze przekazywane są jako referencja (prawdę mówiąc - do niedawna myślałem ze w php jest identycznie)
Sytuacje komplikują jeszcze bardziej planowane zmiany w php 5. Czy więc nie ma na to dobrej odpowiedzi?
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: 22.08.2025 - 13:15