-O3
ha diversi svantaggi:
- Prima di tutto spesso produce codice più lento di
-O2
o-Os
. A volte produce codice più lungo a causa dello srotolamento del ciclo che potrebbe essere in realtà più lento a causa delle peggiori prestazioni della cache del codice. - Come è stato detto, a volte produce codice sbagliato. Potrebbe essere dovuto a un errore nell'ottimizzazione o a un errore nel codice (come ignorare l'aliasing rigoroso). Poiché il codice del kernel a volte è e talvolta deve essere "intelligente", direi che è possibile che qualche sviluppatore del kernel abbia commesso qualche errore. Ho riscontrato vari strani problemi, come il crash delle utilità in spazio utente, quando ho compilato il kernel con gcc 4.5 che a quel punto era stabile. Uso ancora gcc 4.4 per il kernel e diverse utilità dello spazio utente selezionate a causa di vari bug. Lo stesso può valere per
-O3
. - Non penso che offra molti vantaggi al kernel Linux. Il kernel non esegue calcoli pesanti e nei punti in cui lo fa, è ottimizzato con l'assembly.
-O3
flag non modificare il costo del cambio di contesto o la velocità di I/O. Non penso che valga la pena qualcosa come <0,1% di accelerazione delle prestazioni complessive.
È usato in Gentoo e non ho notato nulla di insolito.
Nota che grossi pezzi della toolchain (glibc in particolare) non vengono compilati se cambi i livelli di ottimizzazione. Il sistema di compilazione è impostato per ignorare le tue preferenze -O per queste sezioni sulla maggior parte delle distribuzioni sane.
In poche parole, alcune funzionalità fondamentali della libreria e del sistema operativo dipendono dal codice che fa effettivamente ciò che dice, non ciò che sarebbe più veloce in molti casi. -fgcse-after-reload in particolare (abilitato da -O3) può causare strani problemi.