Bene, il più delle volte il compilatore genera più istruzioni in modo che meno di loro siano eseguite in una determinata esecuzione. Generalmente generando codice specifico per casi diversi:
- Loop srotolamento. Il salto è fatto solo in ogni n (di solito 8) iterazioni.
- Inlining della funzione. Salva la chiamata, restituisce, copia gli argomenti e manipola gli stack.
L'altra cosa è che alcune istruzioni richiedono più tempo di altre. Soprattutto le condizioni difficili da prevedere possono essere notevolmente più lente. Tuttavia, sia le chiamate che i loop sono comuni e il predittore li gestisce bene.
L'altra cosa è la memoria cache, ma qui le cose non sono così chiare. Le cache funzionano meglio quando il codice viene letto linearmente (le funzioni sono in linea), ma ha anche dimensioni limitate, quindi una porzione più grande di codice piccolo verrà memorizzata nella cache.