7

Ho cercato di leggere lo MSDN pages sui vari flag di ottimizzazione.Flag di ottimizzazione di Visual Studio 2013 (/ O2 vs/Ox)

Attualmente la maggior parte dei nostri progetti è impostata su /O2 che ottimizza per "massimizzare la velocità".

La mia confusione è esattamente ciò che significa. Quale delle seguenti affermazioni è più vicina al vero per quanto riguarda il flag /O2?

  1. ottimizzare il codice sia per la velocità e le dimensioni, ma se c'è conflitto preferiscono ottimizzazione per velocità
  2. Ottimizzare il codice solo per la velocità, non ottimizzare per dimensione.

Ho fatto l'argomento che dovremmo usare il flag /Ox, ma quello era quando avevo l'impressione che l'Opzione 2 fosse vera.

Mi è stato detto in sostanza "non cambieremo da /O2 a /Ox a meno che qualcuno non abbia prove concrete che dobbiamo farlo".

Quindi la mia domanda è /O2 eseguire ancora ottimizzazioni di memoria? Per esempio. ottimizzazione del valore di ritorno, copia elisione, ecc. Che cosa potremmo ottenere dal passaggio da /O2 a /Ox?

+0

La pagina/O2 menziona esplicitamente copy elision. E la pagina/Ox dice "In generale, specificare/O2 (Massimizza velocità) anziché/Ox e/O1 (Riduci dimensioni) anziché/Oxs." – Angew

+1

L'ottimizzazione del valore di ritorno, la copia elisione ecc. Sono principalmente un'ottimizzazione * velocità *, direi. – Angew

+0

dal tuo collegamento su/Ox "In generale, specifica/O2 (Massimizza velocità) anziché/Ox" – NathanOliver

risposta

6

Come Arkanosis sottolineato correttamente, quando passando da/O2/Ox, si disattiva/Gs,/GF,/Gy. La domanda è quale di questi flag può aumentare la velocità di esecuzione?

/Gs è identico a /GS0 e può avere un impatto negativo sulle prestazioni. Vedi sotto la descrizione su MSDN.

attiva le sonde di stack per ogni chiamata di funzione che richiede la memorizzazione per le variabili locali. Questo può avere un impatto negativo sulle prestazioni

/GF elimina stringhe duplicate (costanti) - chiamato stringa di mettere in comune. Questo ridurrà la dimensione del codice. Un codice più basso potrebbe produrre un numero inferiore di errori nella cache delle istruzioni, ma dubito che questo effetto sia osservabile sulla maggior parte dei codici.

/Gy bandiera che consente il confezionamento di singole funzioni in strutture COMDAT. Questi possono essere utilizzati come soluzione alternativa per evitare errori di compilazione dovuti a più definizioni dello stesso simbolo. La documentazione MSDN afferma che ciò influisce solo sul tempo di compilazione ma non sul tempo di esecuzione. In genere consigliamo di usarlo.

Conclusione:

/Ox disabilita/Gs,/GF,/Gy. In alcuni casi, queste opzioni danneggiano le prestazioni e quasi mai migliorano la velocità di esecuzione, rispetto a/O2. Ovviamente hanno dei benefici ma non sono legati alla velocità.

+0

'/ Gy' di per sé non migliora le prestazioni in fase di esecuzione, ma l'opzione linker'/OPT: REF' potrebbe (sicuramente riduce le dimensioni del file, specialmente quando si sta collegando con una libreria statica), e richiede '/Gy'. Non ho mai visto nessuno discutere se la riduzione delle dimensioni del codice in termini di pooling delle stringhe sia un vantaggio. Certamente non c'è * danno * nel consolidare le stringhe duplicate. –

+2

"e quasi mai non migliorano la velocità di esecuzione" - Questa parte è un po 'confusa. Intendevi "e non migliorano quasi mai la velocità di esecuzione"? –

0

Quindi la mia domanda è/O2 esegue ancora ottimizzazioni di memoria?

Dipende cosa si intende per ottimizzazione della memoria.

/O1 è garantito per ottimizzare il codice in base alla dimensione binaria.

Crea il codice più piccolo nella maggior parte dei casi.

/O2 mira principalmente a ottimizzare il codice per una maggiore velocità.

Crea il codice più veloce nella maggior parte dei casi. (Impostazione per il rilascio di default costruisce)

Casi quando/O2 è ortogonale/O1 (non limitato) quando

  • compilatore non svolgimento del ciclo,
  • codice di riordino codice
  • inlining

Ora considera/Ox, produce codice che favorisce la velocità di esecuzione su dimensioni più piccole, quindi/Ox non include s/Os (Favor Small Code) riduce al minimo le dimensioni di EXE e DLL, istruendo il compilatore per favorire le dimensioni su velocità.

5
  • /02 è uguale /Og /Oi /Ot /Oy /Ob2 /Gs /GF /Gy
  • /Ox è uguale /Og /Oi /Ot /Oy /Ob2

Quindi si passa da /O2 a /Ox significa:

  • senza /Gs (senza controlli pila sonde)
  • no /GF (nessuna stringa pooling)
  • no /Gy (no-livello di funzione di collegamento)