Optimizacija programa je proces spreminjanja računalniškega programa na način, ki povzroči, da se program hitreje izvaja, porabi manj virov ali na splošno deluje z višjo stopnjo učinkovitosti. Nalogo optimizacije lahko samodejno izvedejo nekateri prevajalniki programskih jezikov, namerno z uporabo optimizacijskega programa ali ročno programerji, ki korakajo skozi izvorno kodo in poskušajo narediti posebne izboljšave. Na splošno se optimizacija programa izvaja s posebnim namenom v mislih, ker je zelo malo splošnih optimizacij, ki jih je mogoče izvesti za program, ki na nek način ne zmanjšajo optimiziranega stanja drugega dela programa, kar pomeni, da program običajno lahko biti optimiziran za hitrost ali uporabo virov, običajno pa ne oboje. Eden od zapletov, ki se lahko pojavijo pri nekaterih vrstah optimizacije, je, da številni programski jeziki na visoki ravni zagotavljajo tako veliko raven abstrakcije med izvorno kodo in računalniškim jezikom, da je optimizacijo težko ali nemogoče izvesti na vseh platformah v vseh situacijah, zlasti pri interpretirani jeziki, ki uporabljajo kompilacijo Just-in-time (JIT).
Pomemben koncept pri optimizaciji programov je ideja, da ima optimizacija običajno neko ceno. Eden od primerov tega je, da ko je del kode optimiziran za hitrejše delovanje, bi lahko povečanje hitrosti prišlo za ceno berljivosti kode, porabe pomnilnika, fleksibilnosti programa ali številnih drugih stroškov. To pomeni, da mora biti optimizacija programa ciljno usmerjen proces z namenom, da en vidik programa deluje na boljši način, hkrati pa je pripravljen žrtvovati učinkovitost drugih vidikov.
Različne vrste optimizacije programa se lahko izvajajo na različnih stopnjah razvoja programa. Med načrtovanjem se lahko opravi široka optimizacija, tako da se zagotovi, da program deluje učinkovito. Pri delu z dejansko izvorno kodo lahko optimizacije vključujejo zagotovitev, da ni tujih ukazov, ponavljajočih se klicev ali slabo napisanih funkcij. Pri prevajanju številne optimizacije samodejno izvede prevajalnik in jih lahko programer vodi z uporabo različnih prevajalskih stikal ali direktiv.
Samodejne optimizacije, kot se lahko zgodijo s prevajalnikom ali programom za optimizacijo predanosti, lahko pogosto vključujejo trike, ki so preveč zapleteni, da bi bili praktični za programerje. To lahko vključuje premikanje navodil v programu, tako da se izvajajo v nasprotnem vrstnem redu, ki so bili prvotno napisani, vendar na učinkovitejši način za procesor. Vključuje lahko tudi namerno premikanje virov, kot so pomnilniški bloki, da je mogoče hitreje dostopati do njih. Večina optimizacije programa se zgodi samodejno na ravni prevajalnika.
Eden od zapletov pri ponavljajoči se ali agresivni optimizaciji programa je, da ko je program spremenjen za učinkovitejše delovanje, ga na splošno postane težje spreminjati za druge namene, kot je dodajanje funkcionalnosti ali odpravljanje napak. To se lahko zgodi, ko optimizacije začnejo zakleniti nastavljena vedenja programa, ki jih ni enostavno spremeniti ali prilagoditi novi kodi, ne da bi bilo treba vse optimizacije razveljaviti. Večja težava je, da v mnogih primerih optimiziran program postane človeku manj berljiv, ker se uporabljajo triki in bližnjice namesto jedrnatih ukazov in klasičnih krmilnih struktur. Zaradi teh razlogov pogosto obstaja stopnja optimizacije programa, pri kateri je sprejemljivo ustaviti, čeprav bi lahko zaradi drastičnih sprememb kode program deloval nekoliko bolj učinkovito.