Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
darioo Forumaš(ica)
Pridružen/a: 06. 02. 2005. (14:26:16) Postovi: (9)16
|
Postano: 14:34 ned, 15. 10. 2006 Naslov: Inline funkcije + reference |
|
|
Asistentu Novakoviću sam postavio par pitanja, na njih dobio korisne odgovore, te dijelim diskusiju sa svima...
Imamo 4 funkcije, rade istu stvar:
int f1(int a, int b) {return a+b;}
int f2(int &a, int &b) {return a+b;}
inline int f3(int a, int b) {return a+b;}
inline int f4(int &a, int &b) {return a+b;}
[quote="venovako"]OK, zamislimo da umjesto int-ova stoji neka grdosija.
Sve sto dolje kazes vrijedi za "dovoljno velike" strukture podataka.[/quote]
Očito je da je poziv f1 najsporiji, zbog pozivanja funkcije i stvaranja kopija a i b.
[quote="venovako"]Ocito.[/quote]
f2 bi trebao biti efikasniji jer baratamo sa stvarnim a i b zbog referenci, no i dalje se funkcija poziva
[quote="venovako"]Malo je smijesno govoriti o efikasnosti za slucaj int-ova. Jest da radimo sa stvarnim a i b, ali za int-ove je vjerojatnije da ce f2 biti sporiji, jer reference jesu pointeri koji se automatski dereferenciraju. Cim imas jedan nivo indirekcije, stvari rade brze samo ako su tipovi dovoljno veliki da je skuplje kopiranje od indirekcije.
Vec za kompleksne brojeve f2 bi vjerojatno radio brze od f1.[/quote]
Pročitah da bi std::cout << f3(a,b) << std::endl; C++ pročitao kao
std::cout << a+b << std::endl;, što zvuči razumno efikasno
[quote="venovako"]Tocnije, mogao bi procitati (ako je pametan i voljan), ali ne mora.[/quote]
Pitanje: da li su f3 i f4 jednako brzi, ili postoji ipak neka razlika?
f4 kao funkcija funkcionira, ali eto, nisam siguran kako ju C++ vidi ako se ponaša slično kao što sam opisao kod f3
[quote="venovako"]Ovo je dobro pitanje. Tocna semantika inline poziva.
Za to bih ipak trebao konzultirati standard.
Naime, ono sto te vjerojatno muci:
ako imamo
int c, d;
da li ce se
f3(c,d);
ekspandirati u (doslovno) c+d
ili ce se stvoriti privremeni objekti a i b, pokopirati u njih c i d, te onda ubaciti a+b
Ovako napamet bi mi se cinilo da semantika funkcije mora ostati identicna bilo da je kompajler odluci razmotati ili ne.
Naime, kompajler je posve slobodan jedan poziv f3 odmotati a drugi ostaviti kao stvarni funkcijski poziv.
Ocekivali bi da se u oba slucaja desavaju istovjetne stvari, inace ne bi bila u potpunosti definirana semantika funkcijskih poziva, sto si niti jedan jezik ne smije priustiti.
Naravno, ako je kompajler siguran da moze optimizirati stvari ne koristenjem kopiranja, a da se apsolutno nista time ne gubi (npr. eliminacija kopiranja vektora moze drasticno promijeniti smisao programa), vjerujem da bi zbilja i optimizirao.[/quote]
Asistentu Novakoviću sam postavio par pitanja, na njih dobio korisne odgovore, te dijelim diskusiju sa svima...
Imamo 4 funkcije, rade istu stvar:
int f1(int a, int b) {return a+b;}
int f2(int &a, int &b) {return a+b;}
inline int f3(int a, int b) {return a+b;}
inline int f4(int &a, int &b) {return a+b;}
venovako (napisa): | OK, zamislimo da umjesto int-ova stoji neka grdosija.
Sve sto dolje kazes vrijedi za "dovoljno velike" strukture podataka. |
Očito je da je poziv f1 najsporiji, zbog pozivanja funkcije i stvaranja kopija a i b.
venovako (napisa): | Ocito. |
f2 bi trebao biti efikasniji jer baratamo sa stvarnim a i b zbog referenci, no i dalje se funkcija poziva
venovako (napisa): | Malo je smijesno govoriti o efikasnosti za slucaj int-ova. Jest da radimo sa stvarnim a i b, ali za int-ove je vjerojatnije da ce f2 biti sporiji, jer reference jesu pointeri koji se automatski dereferenciraju. Cim imas jedan nivo indirekcije, stvari rade brze samo ako su tipovi dovoljno veliki da je skuplje kopiranje od indirekcije.
Vec za kompleksne brojeve f2 bi vjerojatno radio brze od f1. |
Pročitah da bi std::cout << f3(a,b) << std::endl; C++ pročitao kao
std::cout << a+b << std::endl;, što zvuči razumno efikasno
venovako (napisa): | Tocnije, mogao bi procitati (ako je pametan i voljan), ali ne mora. |
Pitanje: da li su f3 i f4 jednako brzi, ili postoji ipak neka razlika?
f4 kao funkcija funkcionira, ali eto, nisam siguran kako ju C++ vidi ako se ponaša slično kao što sam opisao kod f3
venovako (napisa): | Ovo je dobro pitanje. Tocna semantika inline poziva.
Za to bih ipak trebao konzultirati standard.
Naime, ono sto te vjerojatno muci:
ako imamo
int c, d;
da li ce se
f3(c,d);
ekspandirati u (doslovno) c+d
ili ce se stvoriti privremeni objekti a i b, pokopirati u njih c i d, te onda ubaciti a+b
Ovako napamet bi mi se cinilo da semantika funkcije mora ostati identicna bilo da je kompajler odluci razmotati ili ne.
Naime, kompajler je posve slobodan jedan poziv f3 odmotati a drugi ostaviti kao stvarni funkcijski poziv.
Ocekivali bi da se u oba slucaja desavaju istovjetne stvari, inace ne bi bila u potpunosti definirana semantika funkcijskih poziva, sto si niti jedan jezik ne smije priustiti.
Naravno, ako je kompajler siguran da moze optimizirati stvari ne koristenjem kopiranja, a da se apsolutno nista time ne gubi (npr. eliminacija kopiranja vektora moze drasticno promijeniti smisao programa), vjerujem da bi zbilja i optimizirao. |
Zadnja promjena: darioo; 14:46 ned, 15. 10. 2006; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
mesic Forumaš(ica)
Pridružen/a: 01. 07. 2003. (20:16:56) Postovi: (35)16
Spol:
Lokacija: /dev/(m)ucenje
|
Postano: 10:50 pon, 16. 10. 2006 Naslov: |
|
|
Neznam točnu semantiku, ali sam jednom pratio jednu opsežniju raspravu oko inline specifikacije. Otprilike, inline je više [i]hint[/i] prevodiocu, nego zapovjed (to smo znali), pa je naravno na samoj implementaciji da taj hint iskoristi povoljno.
Jedna tehnika je profiliranje kôda, tj. neka rudimentarnija verzija (ipak se radi o prevodiocu, ne pravom profiler-u), pa na osnovu omjera "moguća veličina"/"moguća brzina" prevodioc odlučuje što će napraviti.
Znam da M$ov prevodioc može uzeti datoteku nastalu profiliranjem kôda i na osnovu nje se onda odlučiti za [i]inline[/i] ili ne.
Treba još spomenuti i da će neke funkcije sam prevodioc 'ulinijati', ako zaključi da je to isplativije (barem M$ to radi, za ostale ne znam).
[/i]
Neznam točnu semantiku, ali sam jednom pratio jednu opsežniju raspravu oko inline specifikacije. Otprilike, inline je više hint prevodiocu, nego zapovjed (to smo znali), pa je naravno na samoj implementaciji da taj hint iskoristi povoljno.
Jedna tehnika je profiliranje kôda, tj. neka rudimentarnija verzija (ipak se radi o prevodiocu, ne pravom profiler-u), pa na osnovu omjera "moguća veličina"/"moguća brzina" prevodioc odlučuje što će napraviti.
Znam da M$ov prevodioc može uzeti datoteku nastalu profiliranjem kôda i na osnovu nje se onda odlučiti za inline ili ne.
Treba još spomenuti i da će neke funkcije sam prevodioc 'ulinijati', ako zaključi da je to isplativije (barem M$ to radi, za ostale ne znam).
[/i]
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
HijenA Forumaš(ica)
Pridružen/a: 23. 01. 2004. (16:46:04) Postovi: (3D2)16
Spol:
Lokacija: Prazan skup ;-)
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
pecina Forumaš(ica)
Pridružen/a: 19. 01. 2005. (14:15:23) Postovi: (157)16
Spol:
Lokacija: Happily traveling through space since 1986!
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
|