2013-03-14 15 views
12

Come individuare il compilatore ?Come faccio a sapere dove trascorre il tempo il compilatore?

La mia build è troppo lenta, sto già usando un RAMdisk per i file temporanei VC++ e non fa alcuna differenza. (Ho un SSD, quindi non mi aspettavo alcuna differenza.)

La maggior parte dei singoli file C++ in questo progetto richiede ca. 2 secondi per la compilazione che sembra terribile (dato che anch'io non ho parallelizzazioni in-project perché sto usando VS2005).

Come posso ottimizzare questo? Non ottimizzare senza profiling, ma come faccio a profilare il compilatore?

Nota: Queste non erano veramente utile:

  • Profiling the C++ compilation process
  • Displaying build times in Visual Studio? (Non è del tutto priva di merito anche se ... se si fa una compilation file singolo, invece di tutto il progetto, mostrerà il tempo impiegato per un singolo file: in questo modo vedo che abbastanza alcuni file qui prendono più di 5 secondi, alcuni addirittura 10 secondi quando viene compilato stand-alone)

Aggiungiamo un buon commento: Avete molti modelli? Quanto sono grandi i tuoi file in media? Avete controllato solo il numero minimo di intestazioni necessarie

No, non l'ho fatto. Potrei (e certamente lo farò), naturalmente. Potrei riuscire a trovare qualcosa, ma è tutto speculazione e tentativi ed errori!

"Tutti" ti dice che dovresti ottimizzare solo dopo la misurazione/profilazione, ma quando ottimizzi i tempi di compilazione, siamo di nuovo in prova con l'errore &?


Nota: la proposta di "hack" dai commenti con __TIME__ fa non lavoro, almeno non su Visual-C++, perché (come the docs stato): Il più recente fase di compilazione della file sorgente corrente. Il tempo è una stringa letterale della forma hh: mm: ss. - Immagino che si possa almeno ottenere tempi per le singole unità di compilation con questo timbro, ma non aiuta a scavare in una unità di compilazione.

+0

Avete molti modelli? Quanto sono grandi i tuoi file in media? Hai controllato solo il numero minimo di intestazioni necessarie? – stefan

+0

stai usando le intestazioni precompilate? –

+0

@MartinBa Con "incluso solo il minimo necessario di intestazioni" non è un errore, è una buona pratica. Riguardo alla dimensione media dei file: i compilatori devono analizzare tutto, quindi ovviamente c'è un limite di perfomance dato dalla dimensione del file. Suggerirei un sistema di build incrementale in cui vengono ricompilati solo i file modificati. Quindi non devi preoccuparti di lunghi tempi di compilazione. – stefan

risposta

2

SysInternals ProcMon mostrerà tutto l'I/O eseguito dai processi selezionati, incluso il timestamp quando è successo e il percorso completo.

+0

Hmmm ... sembra difficile da ottenere questo risultato con VC++ ... Ho 'devenv. exe', ma questo genererà 'cl.exe' (tramite alcuni intermediari penso). Hai mai provato questo su una build VS? –

+0

Process Monitor ha filtri molto flessibili. È possibile impostare un filtro che corrisponda all'eseguibile del processo. Non è necessario utilizzare il PID del processo in esecuzione. – Weeble

2

ci sono alcuni modi per ottimizzare il vostro tempo di compilazione:

  • utilizzare un'intestazione precompilata. Se si utilizza Visual C++ di utilizzare "stdafx.h". Per impostazione predefinita, "stdafx.h" è impostato come intestazione precompilata, ma ti consiglio di controllarlo per assicurarti che lo sia.

  • Utilizzare Linux :). Se non devi usare Windows per quello che stai facendo ti consiglio di usare Linux. I tempi di compilazione su di esso sono molto meglio. Alcuni dei motivi sono: ext4 è ~ 40% più veloce di NTFS in media e ha un migliore schedulatore di processi.Quando si tratta di operazioni con i processori, Linux di solito lo fa ~ x1,8 - x2 volte più veloce e la compilazione dipende dal processore.

  • Utilizzare un altro compilatore. Clang/LLVM è noto per avere una migliore velocità di compilazione e ha anche il supporto per le intestazioni precompilate.

+0

* Se si utilizza Visual C++ anziché utilizzare "stdafx.h", inserire tutte le intestazioni in esso. * - Che cattivo consiglio. ** tutte le intestazioni ** è certamente * non * quello che si vorrebbe inserire in 'stdafx.h' (e, sì, lo sto usando per intestazioni comuni selezionate) –

+0

Questo è raccomandato da Microsoft, non da me ... –

+0

MS certamente non lo consiglia. * Tutte le intestazioni *? fornire un riferimento per favore. –

Problemi correlati