Optimizarea programului este procesul de modificare a unui program de calculator într-un mod care face ca programul să se execute mai rapid, să consume mai puține resurse sau, în general, să funcționeze cu un nivel mai ridicat de eficiență. Sarcina de optimizare poate fi efectuată automat de către unii compilatori de limbaje de programare, în mod intenționat prin utilizarea unui program de optimizare, sau manual de către programatori care parcurg codul sursă și încearcă să aducă îmbunătățiri specifice. În general, optimizarea programului este efectuată cu un scop specific, deoarece există foarte puține optimizări generale care pot fi făcute unui program care nu reduc într-un fel starea optimizată a unei alte părți a programului, adică un program de obicei poate să fie optimizat pentru viteza sau utilizarea resurselor, dar de obicei nu ambele. O complicație care poate apărea cu unele tipuri de optimizare este că multe limbaje de programare de nivel înalt oferă un nivel atât de mare de abstractizare între codul nativ și limbajul computerului încât optimizarea poate fi dificil sau imposibil de implementat pe toate platformele în toate situațiile, în special în cazul limbaje interpretate care utilizează compilarea just-in-time (JIT).
Un concept important în optimizarea programului este ideea că o optimizare vine de obicei cu un anumit preț. Un exemplu în acest sens este că, atunci când o bucată de cod este optimizată pentru a rula mai repede, creșterea vitezei ar putea veni cu prețul lizibilității codului, al utilizării memoriei, al flexibilității programului sau al unui număr de alte costuri. Aceasta înseamnă că optimizarea programului trebuie să fie un proces țintit, cu intenția de a face ca un aspect al unui program să funcționeze într-un mod mai bun, în timp ce dorești să sacrifici eficiența altor aspecte.
Diferite tipuri de optimizare a programelor pot fi efectuate în diferite etape de dezvoltare a programului. În timpul proiectării, optimizarea amplă poate fi realizată, asigurându-vă că un program pare să ruleze eficient. Când lucrați cu codul sursă real, optimizările pot include asigurarea că nu există comenzi străine, apeluri repetitive sau funcții prost scrise. La compilare, multe optimizări sunt efectuate automat de către compilator și pot fi ghidate prin utilizarea diferitelor comutatoare sau directive ale compilatorului de către programator.
Optimizările automate, așa cum pot apărea cu un compilator sau un program de optimizare dedicată, pot implica adesea trucuri prea complexe pentru a fi practice pentru programatorii umani. Acest lucru poate implica mutarea instrucțiunilor într-un program, astfel încât acestea să fie executate în afara ordinii scrise inițial, dar într-un mod mai eficient pentru procesor. De asemenea, poate implica schimbarea intenționată a resurselor, cum ar fi blocurile de memorie, astfel încât acestea să poată fi accesate mai rapid. Majoritatea optimizării programelor au loc automat la nivel de compilator.
O complicație cu optimizarea repetată sau agresivă a programului este că, odată ce un program a fost modificat pentru a rula mai eficient, devine, în general, mai dificil de modificat în alte scopuri, cum ar fi adăugarea de funcționalități sau remedierea erorilor. Acest lucru poate apărea atunci când optimizările încep să blocheze comportamentele programelor stabilite care nu sunt ușor modificate sau adaptate la codul nou, fără a necesita anularea tuturor optimizărilor. O problemă mai mare este că, în multe cazuri, un program optimizat devine mai puțin lizibil de către om, deoarece trucurile și comenzile rapide sunt folosite în loc de doar comenzi concise și structuri de control clasice. Din aceste motive, există adesea un nivel de optimizare a programului la care este acceptabil să se oprească, chiar dacă modificările drastice ale codului ar putea face un program să funcționeze puțin mai eficient.