2012-09-23 7 views
5

Pracuję nad dużym projektem, który musi budować w wielu środowiskach, głównie linux/gcc i windows/msvc. Aby przyspieszyć kompilację, używamy prekompilowanych nagłówków.Bez przyspieszenia z prekompilowanymi nagłówkami na gcc (ale dużym przyspieszeniem w visual studio)

Implementacja systemu Windows jest bardzo wydajna: na moim czterordzeniowym systemie Hyperthreaded czas budowy i7 obniża się z 9 minut do 1,5 minuty. Jednak użycie prekompilowanych nagłówków nie poprawia wydajności: w obu przypadkach buduje się w 22 minuty pod wirtualnym pudełkiem na tym samym komputerze lub około 40 minut na prawdziwym serwerze.

Więc myślę, że jest oczywiste, że jakoś coś złego i że prekompilowany nagłówek nie jest kopiący. Nie mogę jednak znaleźć.

Nasze pliki Makefile są generowane przez CMake, więc mogę skopiować wklej kod użyty do kompilacji nagłówka i plików obiektów, które ich używają.

Tworzenie nagłówka:

/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" 

Kompilowanie pliku obiektu:

/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 są doceniane, nawet jeśli nie bezpośrednio wynikają z powyższych fragmentów.

+1

Masz szczęście, odkryłem, że używanie prekompilowanych nagłówków z GCC nawet spowalnia kompilację. CLANG był lepszy jakiś czas temu, ale teraz wydaje się bezwartościowy przy użyciu prekompilowanych nagłówków, pozostawiając MSVC jako jedyny kompilator, który czerpie z niego korzyści. – Lothar

Odpowiedz

1

Jest kilka rzeczy, na które należy zwrócić uwagę podczas używania prekompilowanych nagłówków w GCC. Przede wszystkim prekompilowany nagłówek musi być utworzony z tymi samymi argumentami, co kompilacja plików cpp. Zakładam również, że faktycznie uwzględniono prekompilowany nagłówek w AccountMgr.cpp?

Spróbuj skompilować z flagą -H, spowoduje to wyjście, które uwzględnia pliki są rozważane. Sprawdź, czy podano plik pchdef i zobacz, jakie inne pliki uwzględniane są analizowane. Aby gcc narzekał na nieprawidłowe pliki PCH, rozważ użycie -Winvalid-pch.

+0

Jeśli spojrzysz na polecenia, zobaczysz, że już używam '-Winvalid-pch'. Również nie umieszczam pliku nagłówkowego w 'AccountMgr.cpp', ale nagłówek jest dołączany do opcji' -include'. Spróbuję użyć flagi '-H' i złożyć raport. – Norswap

+0

Uruchomiłem rzecz z flagą "-H", zdecydowanie widzi i używa prekompilowanego nagłówka. Tajemnica gęstnieje. – Norswap

+0

Przez "używa" rozumiesz, że wyświetlona lista plików włączających pokazuje, że wstępnie skompilowane pliki włączeń nie są ponownie uwzględniane? To znaczy. spróbuj uruchomić -H raz z -include i raz bez. Jeśli dane wyjściowe są takie same, to albo PCH nie zawiera niczego istotnego (lub AccountMgr.cpp nie używa wielu elementów) i marnujesz czas używając PCH lub jest to nowa wskazówka. – dseifert

Powiązane problemy