Domanda

Normalmente imposti il ​​tuo compilatore per ottimizzare la massima velocità o la dimensione del codice più piccola?oppure configuri manualmente le singole impostazioni di ottimizzazione?Perché?

Ho notato che la maggior parte delle volte le persone tendono a lasciare semplicemente le impostazioni di ottimizzazione del compilatore al loro stato predefinito, che con Visual C++ significa velocità massima.Ho sempre pensato che le impostazioni predefinite avessero più a che fare con l'aspetto positivo dei benchmark, che tendono ad essere piccoli programmi che si adatteranno interamente alla cache L2 rispetto a ciò che è meglio per le prestazioni complessive, quindi normalmente lo imposto ottimizzandolo per le dimensioni più piccole.

È stato utile?

Soluzione

Come utente Gentoo ho provato diverse ottimizzazioni sull'intero sistema operativo e ci sono state infinite discussioni su Forum Gentoo a proposito.Alcuni buoni flag per GCC possono essere trovati nel file wiki.

In breve, l'ottimizzazione delle dimensioni ha funzionato meglio su un vecchio laptop Pentium3 con RAM limitata, ma sul mio computer desktop principale con un Core2Duo, -O2 ha dato risultati complessivamente migliori.

C'è anche un piccola sceneggiatura se sei interessato ai flag specifici x86 (32 bit) che sono i più ottimizzati.

Se usi gcc e vuoi davvero ottimizzare un'applicazione specifica, prova ACOVEA.Esegue una serie di benchmark, quindi li ricompila con tutte le possibili combinazioni di flag di compilazione.C'è un esempio che utilizza la codifica Huffman sul sito (più basso è meglio):

A relative graph of fitnesses:

   Acovea Best-of-the-Best: **************************************                (2.55366)
     Acovea Common Options: *******************************************           (2.86788)
                       -O1: **********************************************        (3.0752)
                       -O2: ***********************************************       (3.12343)
                       -O3: ***********************************************       (3.1277)
           -O3 -ffast-math: **************************************************    (3.31539)
                       -Os: *************************************************     (3.30573)

(Nota che ha riscontrato che -Os è il più lento su questo sistema Opteron.)

Altri suggerimenti

Preferisco utilizzare dimensioni minime.La memoria può essere economica, la cache non lo è.

Oltre al fatto che la località della cache è importante (come ha detto On Freund), un'altra cosa che fa Microsoft è profilare la propria applicazione e scoprire quali percorsi di codice vengono eseguiti durante i primi secondi di avvio.Successivamente restituiscono questi dati al compilatore e gli chiedono di mettere insieme le parti che vengono eseguite durante l'avvio.Ciò si traduce in tempi di avvio più rapidi.

Credo che questa tecnica sia disponibile pubblicamente in VS, ma non ne sono sicuro al 100%.

Per me dipende da quale piattaforma sto utilizzando.Per alcune piattaforme embedded o quando ho lavorato sul processore Cell ci sono limitazioni come una cache molto piccola o uno spazio minimo fornito per il codice.

Utilizzo GCC e tendo a lasciarlo su "-O2" che è il livello di ottimizzazione "più sicuro" e favorisce la velocità rispetto a una dimensione minima.

Direi che probabilmente non fa un'enorme differenza a meno che tu non stia sviluppando un'applicazione ad altissime prestazioni, nel qual caso dovresti probabilmente confrontare le varie opzioni per il tuo particolare caso d'uso.

Microsoft fornisce tutto il suo software C/C++ ottimizzato per le dimensioni.Dopo il benchmarking hanno scoperto che in realtà offre una velocità migliore (a causa della posizione della cache).

Esistono molti tipi di ottimizzazione, la velocità massima rispetto al codice piccolo è solo uno.In questo caso, sceglierei la velocità massima, poiché l'eseguibile sarà leggermente più grande.D'altra parte, potresti ottimizzare la tua applicazione per un tipo specifico di processore.In alcuni casi questa è una buona idea (se intendete eseguire il programma solo sulla vostra postazione), ma in questo caso è probabile che il programma non funzioni su altre architetture (es:compili il tuo programma per funzionare su una macchina Pentium 4 -> probabilmente non funzionerà su un Pentium 3).

Costruisci entrambi, profila, scegli quale funziona meglio su progetto e hardware specifici.

Per codice critico per le prestazioni, ovviamente, altrimenti scegline uno qualsiasi e non preoccuparti.

Utilizziamo sempre la massimizzazione per una velocità ottimale, ma tutto il codice che scrivo in C++ è in qualche modo correlato agli algoritmi bioinformatici e la velocità è cruciale mentre la dimensione del codice è relativamente piccola.

La memoria oggigiorno costa poco :) Quindi può essere significativo impostare le impostazioni del compilatore sulla massima velocità a meno che non si lavori con sistemi embedded.Naturalmente la risposta dipende dalla situazione concreta.

Dipende dall'applicazione del programma.Quando si programma un'applicazione per controllare un processo industriale veloce, avrebbe senso ottimizzare la velocità.Quando si programma un'applicazione che deve solo reagire all'input dell'utente, l'ottimizzazione delle dimensioni potrebbe avere senso.Cioè, se sei preoccupato per la dimensione del tuo eseguibile.

Modificare le impostazioni del compilatore in questo modo è un'ottimizzazione.Partendo dal principio che "l'ottimizzazione prematura è la radice di tutti i mali", non me ne preoccupo finché il programma non è vicino al suo stato di spedizione finale e ho scoperto che non è abbastanza veloce, ad es.quasi mai.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top