[ aleksandar1519 @ 01.11.2012. 23:09 ] @
Da li bi neko mogao da mi ukratko objasni, ili preporuci neki tekst koji bih mogao da procitam na ovu temu?
[ Nedeljko @ 01.11.2012. 23:42 ] @
GNU kompajler, baš kao i svaki drugi, ima razne direktive kojima mu se naglašava kako da odradi posao. -O se odnosi na optimizaciju. -O0 znači "ne optimizuj ništa"; -O1 znači "optimizuj malo, ali požuri sa kompajliranjem"; -O2 znači "budi umeren, optimizuj ali nemoj previše da žilaviš sa kompajliranjem"; -O3 znači "optimizuj u sitna crevca štagod možeš". Preciznije, postoji sijaset vrsta optimizacije, koje se uključuju i isključuju raznim pojedinačnim direktivama, pri čemu -O0 isključuje sve optimizacije, -O1 uključuje neke, -O2 još neke i -O3 skoro sve, ali ne baš sve.

Za više informacija

man gcc


Naravno, drugi kompajleri imaju svoje direktive.
[ aleksandar1519 @ 02.11.2012. 10:12 ] @
Hvala puno na brzom odgovoru. Da li bi mogao da mi navedes neki primer kako se ta optimizacija koristi u nekom programu? Da li je to neka on "opcija" pri samom setup-u prijekta ili se upisuje neki kod itd?

Nikad nisam radio sa tim optimizacijama tako da bilo kakva informacija je veoma dobro dosla. Kako bi mogao da izguglam vise info o tome? Ja obicno koristim, tj vezbam, na code::block-u, pa me zanima kako da se ta optimizacija implrementira u tom programu.

Jos jednom, hvala puno i pozdrav
[ maksvel @ 02.11.2012. 10:16 ] @
Citat:
Ja obicno koristim, tj vezbam, na code::block-u, pa me zanima kako da se ta optimizacija implrementira u tom programu.

Iz Settings izabereš compiler and debugger i postaviš željene compiler flagove i onda se oni primenjuju, tj. prosleđuju gcc-u pri kompajliranju.
[ Nedeljko @ 02.11.2012. 10:41 ] @
Tačno. Naravno, pod uslovom da koristi GNU prevodilac (standardan pod Linux-om ili iz MinGW projekta pod Windows-om), jer Code::Blocks može da radi i sa drugim kompajlerima. Ako je skinuo Code::Blocks za Windows sa integrisanim kompajlerom, pa to koristi, onda je to to.

Inače, direktive se zadaju kao parametri komandne linije

g++ -O3 program.cpp
[ Ivan Dimkovic @ 02.11.2012. 10:44 ] @
@aleksandar1519,

-Ox (gde je x broj) je informacija za kompajler koja nalaze kompajleru da ukljuci/iskljuci odredjene optimizacije.

Postoji vise nacina da se tvoj kod pisan u, recimo, C++ jeziku, prevede u masinski kod za CPU. U zavisnosti od nivoa optimizacija, kompajler ce izlazni masinski kod optimizovati manje ili vise.

Nisu sve optimizacije "besplatne" - recimo, neke optimizacije za brzinu imaju za cenu veci masinski kod (sto rezultuje vecim izvrsnim fajlom ili bibliotekom) isto kao sto neke optimizacije za velicinu koda imaju los efekat na brzinu. Zbog toga postoje opcije koje to kontrolisu.

U najvecem broju slucajeva -O2 radi posao, ako ti je brzina kljucna stvar i briga te za velicinu fajla koristi -O3

Ako te zanima koje individualne optimizacije mozes da kontrolises, za GCC kompajler to imas ovde:

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Kao sto vidis opcija -Ox (gde je x broj) zapravo kontrolise koje individualne optimizacije kompajler koristi.
[ Nedeljko @ 02.11.2012. 13:26 ] @
Citat:
Ivan Dimkovic: Nisu sve optimizacije "besplatne" - recimo, neke optimizacije za brzinu imaju za cenu veci masinski kod (sto rezultuje vecim izvrsnim fajlom ili bibliotekom) isto kao sto neke optimizacije za velicinu koda imaju los efekat na brzinu. Zbog toga postoje opcije koje to kontrolisu.

U najvecem broju slucajeva -O2 radi posao, ako ti je brzina kljucna stvar i briga te za velicinu fajla koristi -O3

S tim da je danas malo koga briga za veličinu fajla (osim možda u nekim jako specifičnim slučajevima). Glavni "negativan efekat" optimizacije je vreme kompajliranja. Takođe, kada se pravi debug verzija programa, sve optimizacije se isključuju da bi program radio "po Vuku" - onako kako je napisano, ne bi li čovek lakše uvideo grešku u onome što je napisano.
Citat:
Ivan Dimkovic: Ako te zanima koje individualne optimizacije mozes da kontrolises, za GCC kompajler to imas ovde:

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

A sve opcije GNU kompajlera ovde

http://linux.die.net/man/1/gcc

To što je Ivan napisao je pod "Optimization options", ali te možda mogu zanimati i druge opcije. Recimo, neke od najčešće korišćenih su

-oname (daje navedeno ime izlaznom fajlu, ako ne želiš da ti se program zove a.out)
-c (prevedi bez linkovanja. Tako se prevodi svaka jedinica za prevođenje, a tek na kraju sve linkuje)
-llibrary (uključi datu biblioteku),
-Idirectory (uključi navedeni direktorijum u include pretragu)
-Ldirectory (uključi navedeni direktorijum u pretragu biblioteka)
-g uključi debug informacije (neophodne za rad dibagera)
-glevel (gde je level broj od 0 do 3, koji kaže koliko debug informacija da se uključi, 0 za ništa, 3 za skoro sve ili sve)
-fPIC -shared (u kombinaciji za pravljenje deljenih biblioteka, tj. biblioteka za dinamičko linkovanje - pod Linux-om .so,a pod Windows-om (koji valjda ne tražin -fPIC) .dll).
[ Ivan Dimkovic @ 02.11.2012. 15:24 ] @
^ Ovo sto Nedeljko kaze - ako radis debugging, optimizacije treba drzati iskljucene posto inace masinski kod vise nece biti blizak originalnom i imaces znatno teze 'step-ovanje' po linijama koda posto kompajler ima mnogo vecu slobodu za optimizacije.

U svakom slucaju, ako nemas nikakve specificne prohteve, u release verziji stavi -O3, a u debug verziji ne ukljucuj optimizacije - i to bi trebalo da ti radi posao u 99% slucajeva.

Tek kada imas vrlo specificne optimizacione zahteve i kada se detaljno upoznas sa time sta individualne opcije rade, ima nekog smisla eksperimentisati.

Primera radi, code inlining je tipicna opcija koja je mac sa 2 ostrice - sa jedne strane, code inlining ima potencijal da ubrza kod time sto ce male rutine direktno ukljuciti u vece, eliminisuci vreme rezije funkcije. Medjutim, u nekim slucajevima moze da uspori kod zato sto ce povecati footprint koda i zahtevati vise mesta u kesu.