Ohjelman optimointi on prosessi, jolla tietokoneohjelmaa muutetaan tavalla, joka saa ohjelman toimimaan nopeammin, kuluttamaan vähemmän resursseja tai yleensä toimimaan tehokkaammin. Jotkut ohjelmointikielen kääntäjät voivat suorittaa optimointitehtävän automaattisesti, tarkoituksellisesti käyttämällä optimointiohjelmaa, tai manuaalisesti ohjelmoijat, jotka astuvat lähdekoodin läpi ja yrittävät tehdä tiettyjä parannuksia. Yleensä ohjelman optimointi suoritetaan tiettyä tarkoitusta silmällä pitäen, koska ohjelmalle voidaan tehdä vain vähän yleisiä optimointeja, jotka eivät millään tavalla vähennä ohjelman toisen osan optimoitua tilaa, mikä tarkoittaa, että ohjelma voi yleensä optimoida nopeuden tai resurssien käytön mukaan, mutta yleensä ei molempia. Eräs komplikaatio, joka voi ilmetä tietyntyyppisten optimointityökalujen yhteydessä, on se, että monet korkean tason ohjelmointikielet tarjoavat niin suuren abstraktion alkuperäisen koodin ja tietokoneen kielen välillä, että optimointi voi olla vaikeaa tai mahdotonta toteuttaa kaikilla alustoilla kaikissa tilanteissa, erityisesti tulkittuja kieliä, jotka käyttävät juuri oikea-aikaista (JIT) kokoamista.
Tärkeä käsite ohjelman optimoinnissa on ajatus siitä, että optimointiin liittyy yleensä jonkinlainen hinta. Yksi esimerkki tästä on se, että kun koodikappale on optimoitu toimimaan nopeammin, nopeuden kasvu voi tulla koodin luettavuuden, muistin käytön, ohjelman joustavuuden tai monien muiden kustannusten hintaan. Tämä tarkoittaa sitä, että ohjelman optimoinnin on oltava kohdennettu prosessi, jonka tarkoituksena on saada yksi ohjelman osa toimimaan paremmin samalla, kun se on valmis uhraamaan muiden näkökohtien tehokkuuden.
Erilaisia ohjelmien optimointeja voidaan suorittaa ohjelman kehittämisen eri vaiheissa. Suunnittelun aikana laaja optimointi voidaan tehdä varmistamalla, että ohjelma näyttää toimivan tehokkaasti. Kun työskentelet varsinaisen lähdekoodin kanssa, optimointiin voi kuulua sen varmistaminen, että ei ole vieraita komentoja, toistuvia puheluita tai huonosti kirjoitettuja toimintoja. Kääntämisessä kääntäjä suorittaa automaattisesti monia optimointeja, ja ohjelmoija voi ohjata niitä eri kääntäjäkytkimien tai -ohjeiden avulla.
Automaattiset optimoinnit, kuten voi tapahtua kääntäjän tai omistautumisen optimointiohjelman yhteydessä, voivat usein sisältää temppuja, jotka ovat liian monimutkaisia ollakseen käytännöllisiä ihmisohjelmoijille. Tämä voi sisältää ohjeiden siirtämisen ohjelmassa, jotta ne suoritetaan alun perin kirjoitetusta järjestyksestä, mutta tehokkaammin prosessorin kannalta. Se voi myös sisältää tarkoituksella resurssien, kuten muistilohkojen, siirtämistä, jotta niihin pääsee nopeammin. Suurin osa ohjelman optimoinnista tapahtuu automaattisesti kääntäjän tasolla.
Yksi komplikaatio toistuvassa tai aggressiivisessa ohjelman optimoinnissa on se, että kun ohjelmaa on muokattu toimimaan tehokkaammin, sitä on yleensä vaikeampi muokata muihin tarkoituksiin, kuten toimintojen lisäämiseen tai virheiden korjaamiseen. Tämä voi tapahtua, kun optimoinnit alkavat lukita tiettyjä ohjelmakäyttäytymisiä, joita ei ole helppo muuttaa tai mukauttaa uuteen koodiin ilman, että kaikki optimoinnit on peruutettava. Suurempi ongelma on se, että monissa tapauksissa optimoidusta ohjelmasta tulee vähemmän ihmisen luettavissa, koska temppuja ja pikavalintoja käytetään vain ytimekkäiden komentojen ja klassisten ohjausrakenteiden sijasta. Näistä syistä on usein ohjelman optimointitaso, jolla se on hyväksyttävää pysäyttää, vaikka jyrkät koodimuutokset saattavat saada ohjelman toimimaan hieman tehokkaammin.