2012-09-23 14 views
5

Ich arbeite an einem großen Projekt, das unter mehreren Umgebung erstellt werden muss, vor allem Linux/GCC und Windows/msvc. Um den Build zu beschleunigen, verwenden wir vorkompilierte Header.Keine Beschleunigung mit vorkompilierten Headern auf gcc (aber große Beschleunigung mit Visual Studio)

Die Windows-Implementierung ist sehr effizient: auf meinem Quad-Core hyperthreaded i7 baut die Zeit von 9 Minuten auf 1,5 Minuten. Die Verwendung vorkompilierter Header scheint die Leistung jedoch nicht zu verbessern: In beiden Fällen wird sie in 22 Minuten unter einer virtuellen Box auf demselben Computer oder in etwa 40 Minuten auf einem echten Server erstellt.

Also denke ich das Offensichtliche, dass ich irgendwie etwas falsch gemacht habe und dass der vorkompilierte Header nicht ins Spiel kommt. Ich kann aber was nicht finden.

Unsere Makefiles werden von CMake generiert, sodass ich den Code kopieren kann, der zum Kompilieren des Headers und der Objektdateien verwendet wurde, die sie verwenden.

Erstellen der Kopfzeile:

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

eine Objektdatei Kompilieren:

/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 geschätzt werden, auch wenn sie stammen aus den oben Schnipsel nicht direkt zu tun.

+1

Sie haben Glück, ich fand, dass die Verwendung vorkompilierter Header mit GCC sogar den Build verlangsamt. CLANG war vor einiger Zeit besser, aber jetzt scheint es wertlos zu sein, vorkompilierte Header zu verwenden, was MSVC als einzigen Compiler übrig lässt, der davon profitiert. – Lothar

Antwort

1

Es gibt ein paar Dinge, die Sie beachten müssen, wenn Sie vorkompilierte Header in GCC verwenden. Zuallererst muss der vorkompilierte Header mit den gleichen Argumenten erstellt werden wie die cpp-Dateien kompiliert werden. Außerdem nehme ich an, dass Sie den vorcompilierten Header in AccountMgr.cpp wirklich eingeschlossen haben?

Versuchen Sie, mit dem -H Flag zu kompilieren, dies wird ausgegeben, welche Include-Dateien berücksichtigt werden. Überprüfen Sie, ob die Pchdef-Datei erwähnt wird und welche anderen Include-Dateien analysiert werden. Um gcc über ungültige PCH-Dateien zu beschweren, erwägen Sie die Verwendung von -Winvalid-pch.

+0

Wenn Sie sich die Befehle ansehen, werden Sie sehen, dass ich bereits '-Winvalid-pch' verwende. Ich habe auch nicht die Header-Datei in "AccountMgr.cpp", aber die Kopfzeile wird mit der Option "-include" enthalten. Ich werde versuchen, die "-H" -Flagge zu verwenden und Bericht zu erstatten. – Norswap

+0

Ich habe die Sache mit dem "-H" -Flag ausgeführt, es sieht und verwendet definitiv den vorkompilierten Header. Das Geheimnis verdichtet sich. – Norswap

+0

Mit "uses" meinen Sie, dass die Liste der angezeigten Include-Dateien zeigt, dass vorkompilierte Include-Dateien nicht wieder enthalten sind? I.e. versuche einmal mit -include und einmal ohne -H zu laufen. Wenn die Ausgabe die gleiche ist, dann enthält entweder Ihr PCH nichts Relevantes (oder AccountMgr.cpp verwendet nicht viele Includes) und Sie verschwenden nur Zeit mit dem PCH, oder es ist ein neuer Hinweis. – dseifert