2011-02-01 2 views
5

Quando eseguo una nuova compilation per il mio progetto, che include oltre 10 librerie open source. Ci vogliono circa 40 minuti. (su hardware normale)Che cos'è il collo di bottiglia delle prestazioni di compilazione C++?

Domanda: dove sono veramente i miei colli a bottiglia? ricerca del disco rigido o CPU Ghz? Non credo che il multi-core sarebbe di grande aiuto?

--edit 1--
mio normale hardware = i3 oc a 4.0GHz, 8GB DDR3 1600Mhz e 2TB Western Digital

--edit 2--
mio codice = 10%, librerie = 90%, so che non devo creare tutto ogni volta, ma mi piacerebbe scoprire come migliorare le prestazioni di compilazione, quindi quando acquisto un nuovo pc per sviluppatore, farei una scelta più intelligente.

--edit 3--
cc = Visual Studio (maledetto)

+0

Quantificare "hardware normale". –

+2

Significa che ricompili tutte quelle librerie? Quanto è grande la tua parte del progetto? –

+2

Inoltre, il multi-core può aiutare - VS potrebbe compilare più file contemporaneamente (usando thread diversi per ogni file) e, se non sbaglio, questo dipende dal numero di core. –

risposta

2

Dal VS 2010, VS può facoltativamente utilizzare più core durante la compilazione di un singolo progetto. Può anche compilare più progetti in parallelo. Tuttavia, l'accelerazione parallela non sembra essere significativa nella mia esperienza: ad es. Xcode è molto più bravo a fare parallel build.

Fortunatamente non è possibile ricostruire le librerie open source ogni volta, giusto? Potresti crearli una volta, archiviare i file .lib nel controllo di versione e usarli per le build successive.

Hai provato i file di intestazione precompilati per il tuo codice? Questo può dare una grande accelerazione.

+0

sì, lo so che non devo costruire tutto dalla lezione 1 di CS, ma sono solo un noob paranoico. quello vuole fare fresco costruire tutto per una nuova versione. – c2h2

+0

@ c2h2: Allora sarai un paranoico noob che spreca soldi in hardware e passa un sacco di tempo a starsene annoiato, aspettando che il tuo codice venga compilato. Seriamente, approfitta del supporto delle intestazioni precompilate del compilatore: è lì per un motivo e funziona perfettamente. Il codice della libreria * non * cambierà. –

+0

@ c2h2: Quanto spesso costruisci una nuova versione? È un tempo di costruzione di 40 minuti un enorme affare, anche se lo fai una volta al giorno? (Intendevi qualcosa di diverso da ogni nuova versione?) –

4

ti sbagli, multi-core porta un'accelerazione enorme, fino a quando il momento il vostro disco rigido si arrende in realtà :)

Prova dell'esempio: distcc, che fornisce build distribuiti (My build utilizza circa 20 core in parallelo, in realtà è vincolato dalla fase di pre-elaborazione locale).

Per quanto riguarda il vero collo di bottiglia, ha qualcosa a che fare con il meccanismo #include. Le lingue con i moduli sono compilate molto più rapidamente ...

1

Quando si compila da zero, sì, ci vorrà più tempo. Usa la tecnologia quarantennale di make, che VS include come project management, per compilare solo ciò che deve essere compilato dopo la prima esecuzione.

Detto questo, il modello di unità di traduzione di C++ e l'uso estensivo di modelli possono rappresentare un problema pratico significativo.

2

compilazione multicore sarà aiuto, tremendamente nella maggior parte dei casi.

dovrai analizzare i tuoi progetti e il tempo trascorso in ciascuna fase per determinare dove sono i colli di bottiglia.

in tipici progetti C++ di grandi dimensioni, il processo è in genere limitato alla CPU, quindi limitato al disco. se è il contrario, probabilmente sei nell'inferno della dipendenza dall'intestazione.

ci sono un sacco di modi per ridurre i tempi di compilazione e la dipendenza nei progetti.il miglior riferimento singolare che conosco è da Lakos:

http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/0201633620/ref=sr_1_1?ie=UTF8&qid=1296569079&sr=8-1

è uno dei più importanti libri pratici/C++ che ho letto.

in genere è possibile ridurre drasticamente i tempi di compilazione (ad esempio, oltre 40 volte più velocemente se lo si prende molto sul serio), ma può richiedere molto lavoro/tempo per correggere le codebase esistenti.

4

40 minuti per la compilazione è molto probabile (in effetti a 40 minuti mi spingerei a dire quasi definitivamente) causato da un uso limitato #include. Stai includendo cose che non devono essere incluse, potrebbero solo essere necessarie dichiarazioni anticipate.

Riordinare il codice farà enormi differenze. So che è molto lavoro, ma sarai sorpreso. In una società che ho lavorato in una biblioteca che impiegava più di 30 minuti per la costruzione, sono stato ottimizzato fino a 3 minuti in una settimana, assicurandomi che fossero necessari tutti gli #includes e aggiungendo dichiarazioni forward anziché #includeing. Questa libreria era significativamente più di un milione di righe di codice per darti un'idea ...

+0

grazie indagherò con il team. – c2h2

+0

ottima idea! userò avanti la dichiarazione da ora in poi (quando applicabile)! :) – Donotalo