Sto costruendo un sacco di codice generato automaticamente, incluso un file particolarmente grande (~ 15K linee), usando un cross-compilatore mingw32 su linux. La maggior parte dei file è estremamente veloce, ma questo file di grandi dimensioni richiede un tempo inatteso (circa 15 minuti) per la compilazione.Come faccio a sapere perché g ++ impiega molto tempo su un particolare file?
Ho provato a manipolare varie bandiere di ottimizzazione per vedere se hanno avuto alcun effetto, senza alcuna fortuna. Quello di cui ho veramente bisogno è un modo per determinare che cosa sta facendo g ++ che richiede tanto tempo. Ci sono dei modi (relativamente semplici) per fare in modo che g + + generi l'output su diverse fasi della compilazione, per aiutarmi a restringere il problema?
Purtroppo, non ho la possibilità di ricostruire questo cross-compiler, quindi aggiungere le informazioni di debug al compilatore e passarlo attraverso non è una possibilità.
Cosa c'è nel file:
- un mazzo di comprende
- un mucchio di confronti tra stringhe
- una serie di if-then controlli e invocando un costruttore
Il file è un fabbrica per produrre una tonnellata di sottoclassi specifiche differenti di una certa classe genitore. La maggior parte degli include, tuttavia, non sono niente di particolarmente fantasioso.
I risultati di -ftime-report, come suggerito da Neil Butterworth, indicano che la fase di "analisi della vita" sta prendendo 921 secondi, che occupa la maggior parte dei 15 minuti.
Sembra che ciò avvenga durante l'analisi del flusso di dati. Il file stesso è un insieme di confronti di stringhe condizionali, che costruiscono un oggetto per nome di classe fornito come stringa.
Pensiamo che cambiando questo punto in una mappa di nomi per i puntatori di funzione si possa migliorare un po 'le cose, quindi proveremo a farlo.
Infatti, generando una serie di funzioni predefinite (per oggetto) e la creazione di una mappa dal nome stringa dell'oggetto a un puntatore alla funzione ridotta fabbrica fase di compilazione dall'originale 15 minuti per circa 25 secondi, che farà risparmiare a tutti un sacco di tempo sulle loro build.
Grazie ancora a Neil Butterworth per il suggerimento circa -ftime-report.
Dai un'occhiata a questo: http: //stackoverflow.com/questions/318398/why-does-c-compilation-take-so-long –
Puoi dirci cosa c'è nel file? Funzioni in linea? Enums? Definisce? Include e liste macro? Quanti di loro? – Coincoin
Hai lo stesso problema se usi il compilatore locale? In tal caso, è possibile ricostruirlo con il profilo abilitato per vedere dove viene speso il tempo. –