2012-06-07 12 views
11

Per quanto riguarda le ottimizzazioni fatte dal compilatore (GCC), qual è la pratica standard? Cosa fa ciascuna opzione (-O, -O1, -O2, -O3, -Os, -s, -fexpensive-optimizations) in modo diverso, e come posso decidere cosa è ottimale?Quanto dovrei ottimizzare?

+0

http://stackoverflow.com/questions/19689014/gcc-difference-between-o3-and-os || http://stackoverflow.com/questions/11546075/is-optimisation-level-o3-dangerous-in-g –

risposta

8

Di solito -O2 è un buon livello di ottimizzazione per provare prima.

Tuttavia, se si desidera ottenere il miglior risultato possibile, si finirà per provare molti livelli di ottimizzazione poiché non è possibile stabilire in anticipo quale sia il livello migliore per la propria app.

prendere anche notare che i risultati di ottimizzazione deve variare con ogni CPU (CPU su alcuni ottimizzazione per dimensioni potrebbe effettivamente produrre una velocità migliore ottimizzazione per velocità).

Solo per riferimento futuro, ecco una breve descrizione di ogni livello (potete trovare la descrizione completa nella documentazione http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html):

-O (identico a -O1): Con -O, i tentativi del compilatore per ridurre le dimensioni del codice e i tempi di esecuzione, senza eseguire alcuna ottimizzazione che richiede molto tempo di compilazione.

-O2: ottimizzare ancora di più. GCC esegue quasi tutte le ottimizzazioni supportate che non comportano un compromesso spazio-velocità. Rispetto a -O, questa opzione aumenta sia il tempo di compilazione che le prestazioni del codice generato.

-O3: Ottimizza ancora di più. -O3 attiva tutte le ottimizzazioni specificate da -O2 e attiva anche le funzioni -finline, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload, -ftree-vectorize, -ftree-partial-pre e - opzioni fipa-cp-clone.

-Os: Ottimizza per dimensione.-Os consente tutte le ottimizzazioni -O2 che in genere non aumentano le dimensioni del codice. Esegue inoltre ulteriori ottimizzazioni progettate per ridurre le dimensioni del codice.

-Operto: ignorare la conformità agli standard rigidi. -Fast consente tutte le ottimizzazioni -O3. Consente inoltre ottimizzazioni che non sono valide per tutti i programmi conformi agli standard. Attiva -ffast-math e il Fortran-specifico -fno-protect-parens e -fstack-array. Se si utilizzano più opzioni -O, con o senza numeri di livello, l'ultima opzione è quella che è efficace.

+0

Grazie, soprattutto per quel collegamento. Molto utile. –

2

Il kernel Makefile del kernel Linux fornisce sia -O2 sia -Os. O uno sarebbe appropriato senza ulteriori dettagli.

Il -Os ottimizza per archiviazione di piccole dimensioni. Dal momento che le CPU sono molto più veloci rispetto alla memoria principale, l'ottimizzazione per la memorizzazione di piccole dimensioni ha senso anche su macchine enormi: qualsiasi tempo trascorso in attesa che la cache venga popolata dalla memoria principale è tempo sprecato. Quindi sfruttare al massimo la cache delle istruzioni compilando per l'efficienza dello spazio e forse il tempo di esecuzione sarà anche migliorare.

Il -O2 esegue tutte le "solite ottimizzazioni" e le ottimizzazioni scelte saranno sicure. (Ho sentito che alcuni dei -O3 ottimizzazioni non sono sempre sicuro, ma che potrebbe essere dovuto al fatto che il kernel Linux gira con alcuni vincoli non comuni alle applicazioni usuali.)

Il migliore risposta, naturalmente, è compilare il software con più livelli di ottimizzazione; tempo il tempo necessario per compilare il software e tempo quanto tempo impiega il software per eseguire un test benchmark rappresentativo. Misura la quantità di memoria utilizzata per tutti loro.

Quindi selezionare la "migliore" combinazione di velocità di compilazione, velocità di esecuzione e utilizzo della memoria del tempo di esecuzione. Potresti volere compilazioni più veloci o potresti desiderare tempi di esecuzione più veloci, oppure potresti cercare di inserirti in una quantità minore di memoria da un provider di hosting virtuale per risparmiare denaro.

Probabilmente è giusto scegliere -O2 senza effettuare alcuna misurazione.

Problemi correlati