2012-11-09 15 views
14

Ho un progetto enorme, qualcosa di circa 150.000 LOC di codice C++. Il tempo di costruzione è di circa 15 minuti. Questo progetto consiste in molti sotto-progetti di diverse dimensioni.Il tempo di compilazione GCC non beneficia molto delle intestazioni precompilate

Ho creato intestazioni precompilate separate per ogni sottoprogetto, ma quando le utilizzo il tempo di costruzione rimane all'incirca uguale. Sembra che il tempo di costruzione sia inferiore del 5-10% percento, non di più.

intestazioni precompilate è sicuramente utilizzato, io uso -Winvalid-pch opzione e ho cercato di compilare con -H opzione del compilatore, le mie intestazioni precompilate appare in uscita con il simbolo 'bang', che significa che il compilatore è in grado di utilizzare intestazione precompilata.

Tutte le intestazioni precompilate non sono molto grandi, ogni file è qualcosa di circa 50 Mb. Io uso lo script python, ho trovato here per generare una lista delle intestazioni precompilate più utilizzate, quindi la mia lista di candidati alla precompilazione è abbastanza buona.

Esistono strumenti gratuiti/open source per l'ottimizzazione della build? Sembrava che l'utilità standard make non fosse in grado di misurare i tempi di costruzione di bersagli diversi. Non riesco a trovare il modo di ottenere le statistiche per target diversi con make. Non sto parlando di analisi di dipendenza o qualcosa di avanzato. Voglio solo sapere per quali obiettivi la maggior parte del tempo è stata sprecata.

Inoltre, sembrava che GCC fosse abbastanza inefficiente nel gestire le intestazioni precompilate. Non ero in grado di ottenere una compilazione di sottoprogetti notevolmente più veloce, la massima velocità che ottengo è del 20% su un progetto che richiede tre minuti per essere realizzato. Sembrava che fosse più facile ed economico acquistare una macchina più veloce con unità a stato solido piuttosto che ottimizzare i tempi di costruzione su Linux con GCC.

+1

provare a creare sia con il codice sorgente sia con la directory di output che si trova in/dev/shm. Se il tempo di costruzione diminuisce drasticamente, il tuo file system di build precedente è stato il principale contributore per la creazione di tempo. – bobah

+4

Non lo definirei enorme.Più simile a un progetto tra piccole e medie dimensioni :) –

+0

@ BЈовић d'accordo, ma aumentare la compilazione più veloce (o almeno comparabile) sulla mia macchina. – Lazin

risposta

6

Se si desidera ottenere il massimo da questa funzionalità, è necessario comprendere in che modo è possibile strutturare i progetti per sfruttarli al meglio. Il modo migliore è il processo lento e difficile di ridurre manualmente i tempi di costruzione. Sembra davvero stupido all'inizio, ma se tutte le build che vanno avanti sono 5 volte più veloci e sai come strutturare i tuoi progetti e le dipendenze andando avanti, allora ti rendi conto del guadagno.

È possibile impostare un sistema di integrazione continua con i tuoi obiettivi per misurare e registrare i tuoi progressi/miglioramenti come le modifiche entrano.

Ho un progetto enorme, qualcosa di circa 150 000 LOC di codice C++. Il tempo di costruzione è di circa 15 minuti. Questo progetto consiste in molti sotto-progetti di diverse dimensioni.

Sembra che stia facendo un sacco di lavoro ridondante, assumendo che tu abbia una macchina moderna.

Considerare anche i tempi di collegamento.

Tutte le intestazioni precompilate non sono molto grandi, ogni file è qualcosa di circa 50Mb.

Questo è abbastanza grande, IMO.

Non sto parlando di analisi delle dipendenze o qualcosa di avanzato.

Ancora, Integrazione continua per le statistiche.Per una build così lenta, le dipendenze eccessive sono molto probabilmente il problema (a meno che non si abbiano molti piccoli file cpp o qualcosa di sciocco come l'esaurimento della memoria fisica).

sono stato in grado di ottenere qualsiasi accumulo sottoprogetto in particolare più veloce, massima accelerazione che ottengo è del 20%

capire le vostre strutture e le dipendenze. I PCH rallentano la maggior parte dei miei progetti.

Sembrava più semplice ed economico acquistare una macchina più veloce con unità a stato solido piuttosto che ottimizzare i tempi di costruzione su Linux con GCC.

Le probabilità sono, che la macchina non renderà il vostro tempo di compilazione 20 volte più veloce, ma sistemando le dipendenze e strutture di progetto può rendere 20 volte più veloce (o qualunque sia la radice del problema è in definitiva). La macchina aiuta molto (considerando il tempo di compilazione per 150KSLOC).

La tua build è probabilmente legata alla CPU/memoria.

+0

Sembra che abbia molti piccoli file cpp: '% find. -name "* .cpp" | grep. -c' restituisce 846. Inoltre, questo progetto consiste principalmente di due grandi librerie statiche, altri progetti sono relativamente piccoli, ognuno di essi è più piccolo di qualsiasi di queste grandi librerie statiche. Una di queste librerie statiche ha una dimensione di 700 MB. E il code-base è molto orientato al boost, ad esempio usa molto bene. – Lazin

+0

@Lazin hmm ... circa 1 file al secondo potrebbe non essere così negativo per le dimensioni e l'hardware del progetto. clang si costruisce più velocemente di gcc sul mio sistema - provalo. analisi delle dipendenze e riduzione, http://code.google.com/p/include-what-you-use/, forse unità build. una volta ridotte le dipendenze, è possibile ridurre ciò che include il PCH. determinare anche se è possibile riutilizzare PCH. tutti questi file cpp aumenteranno le dimensioni dei file degli oggetti e i tempi di collegamento. in tal caso, potresti avere un sacco di I/O durante la costruzione. ovviamente, tutti quei piccoli file probabilmente faranno aumentare anche la quantità di compilation ridondante. – justin

+1

clang non compila il nostro progetto a causa di BOOST_STATIC_ASSERT e poche altre cose. Proverò questo strumento più tardi, mi è sembrato molto utile. Grazie! – Lazin

10

GCC tempo di costruzione non beneficia molto da intestazioni precompilate

Sì, purtroppo questo è spesso vero,

Ci sono alcuni progetti sperimentali per fare qualcosa di meglio, vedi http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3426.html e http://gcc.gnu.org/wiki/pph, ma non sono ancora utilizzabili

Sono d'accordo con l'altra risposta che 15 minuti per 150KLOC sono piuttosto lenti.

Ho trovato che usare il linker Gold fa un'enorme differenza per i tempi di costruzione, lo consiglio vivamente.

Si potrebbe anche considerare ccache che può aiutare, e se si dispone di bici pezzi su altre macchine distcc

evitare di costruire su dischi lenti, certamente evitare di dischi in rete. Evita le invocazioni ricorsive, che impiegano più tempo a leggere i makefile e a ricreare i grafici delle dipendenze. Se riesci a strutturare i tuoi makefile del sotto-progetto in modo che possano essere tutti inclusi da un singolo makefile di primo livello, un make non ricorsivo richiederà un po 'più di tempo per iniziare, ma volerà una volta che inizierà a costruire obiettivi. Però, può essere un sacco di lavoro per riscrivere i makefile.

E probabilmente va da sé, ma a costruire su una macchina multicore e utilizzare make -j N dove una buona regola generale è che N dovrebbe essere due volte il numero di core, o più, se la compilazione di I/O bound.

+2

Ho provato ccache, la ricompilazione ora è molto veloce. Proverò oro linker tomorow, grazie per il consiglio. – Lazin

0

Uso -include quando si genera e si utilizza il PCH per includere un file che include molte intestazioni. Aiuta, ma non è ancora così impressionante.

Conta le tue benedizioni, però: gcc sembra essere molto più veloce di, per dire, MSVC, anche se MSVC ha un supporto PCH migliore.

Problemi correlati