2012-09-23 15 views
5

Sto lavorando su un progetto di grandi dimensioni che deve essere compilato in più ambienti, principalmente linux/gcc e windows/msvc. Per accelerare la build, utilizziamo le intestazioni precompilate.Nessuna accelerazione con intestazioni precompilate su gcc (ma grande accelerazione con Visual Studio)

L'implementazione di Windows è molto efficiente: il tempo di costruzione i7 con iperthreading quad-core scende da 9 minuti a 1,5 minuti. Tuttavia, l'utilizzo di intestazioni precompilate non sembra migliorare le prestazioni: in entrambi i casi, si crea in 22 minuti sotto una scatola virtuale sullo stesso computer, o circa 40 minuti su un server reale.

Quindi penso che sia ovvio, che in qualche modo ho qualcosa di sbagliato e che l'intestazione precompilata non sta dando il calcio. Non riesco a trovare cosa comunque.

I nostri Makefile sono generati da CMake, quindi posso copiare incollare il codice utilizzato per compilare l'intestazione e i file oggetto che li utilizzano.

Creare l'intestazione:

/usr/bin/c++ -O3 -DNDEBUG --no-warnings "-I/mnt/code/server a/src/game" 
"-I/mnt/code/server a/src/game/vmap" "-I/mnt/code/server a/dep/include/g3dlite" 
"-I/mnt/code/server a/dep/include" "-I/mnt/code/server a/src/shared" 
"-I/mnt/code/server a/src/framework" "-I/mnt/code/server a/buildlinux" 
"-I/mnt/code/server a/buildlinux/src/shared" -I/usr/include/mysql 
"-I/mnt/code/server a/dep/acelite" -DDO_MYSQL -DHAVE_CONFIG_H 
-DVERSION=\"0.6.1\" -DSYSCONFDIR=\"../etc/\" -D_RELEASE -D_NDEBUG -x c++-header 
-o "/mnt/code/server a/buildlinux/src/game/pchdef.h.gch" "/mnt/code/server 
a/src/game/pchdef.h" 

Compilazione di un file oggetto:

/usr/bin/c++ $(CXX_DEFINES) $(CXX_FLAGS) "-I/mnt/code/server 
a/buildlinux/src/game" -include pchdef.h -Winvalid-pch -o 
CMakeFiles/game.dir/AccountMgr.cpp.o -c "/mnt/code/server 
a/src/game/AccountMgr.cpp" 

Insights sono apprezzati, anche se non lo fanno direttamente derivano dai frammenti di cui sopra.

+1

Sei fortunato, ho scoperto che l'utilizzo di intestazioni precompilate con GCC rallenta anche la compilazione. CLANG era migliore qualche tempo fa, ma ora sembra inutile usare intestazioni precompilate, lasciando MSVC come l'unico compilatore che ne trae beneficio. – Lothar

risposta

1

Ci sono un paio di cose a cui bisogna prestare attenzione quando si utilizzano le intestazioni precompilate in GCC. Innanzitutto, l'intestazione precompilata deve essere creata con gli stessi argomenti dei file cpp in fase di compilazione. Suppongo anche che tu abbia effettivamente incluso l'intestazione precompilata in AccountMgr.cpp?

Provare a compilare con il flag -H, questo produrrà quali file inclusi vengono considerati. Verificare che il file pchdef sia menzionato e vedere quali altri file di inclusione vengono analizzati. Per fare in modo che GCC si lamenti dei file PCH non validi, prendi in considerazione l'utilizzo di -Winvalid-pch.

+0

Se osservate i comandi, vedrete che sto già usando '-Winvalid-pch'. Inoltre non includo il file di intestazione in 'AccountMgr.cpp', ma l'intestazione viene inclusa con l'opzione' -include'. Proverò ad usare il flag '-H' e riferirò. – Norswap

+0

Ho eseguito la cosa con il flag "-H", sicuramente vede e utilizza l'intestazione precompilata. Il mistero si infittisce. – Norswap

+0

Con "usi" intendi che l'elenco dei file di inclusione visualizzati mostra che i file di inclusione precompilati non sono inclusi di nuovo? Cioè prova a eseguire -H una volta con -include e una volta senza. Se l'output è lo stesso, il PCH non include nulla di rilevante (o AccountMgr.cpp non utilizza molti inclusi) e si perde tempo usando il PCH, o è un nuovo indizio. – dseifert

Problemi correlati