Kompilierzeit von Headern verkürzen



  • Hallo zusammen,

    Besonders bei Boost-Headern ist mir aufgefallen, dass vor allem durch die Templategeschichten die Kompilierzeit erhöht wird. Das finde ich ermüdend, da ich manchmal oft nur ein lexical_cast<int> oder sowas brauche, und dafür könnte ich mir die benötigte Funktionalität auch selbst schreiben.

    Kann man da irgendwie Abhilfe schaffen? Denn ich benutze meistens die gleichen Template-Instanziierungen. Bei Funktionen könnte man eventuell einen eigenen Schnittstellen-Header bereitstellen und dann die benötigten Templates in einer separaten CPP-Datei kompilieren. Aber bei Klassen ist das schon mühsamer...

    Können vorkompilierte Header etwas dazu beitragen? Falls ja, wie funktionieren die genau? Ich hab mich noch nicht gross mit ihnen beschäftigt...



  • Nexus schrieb:

    Können vorkompilierte Header etwas dazu beitragen? Falls ja, wie funktionieren die genau? Ich hab mich noch nicht gross mit ihnen beschäftigt...

    http://en.wikipedia.org/wiki/Precompiled_header#Common_Implementations



  • Danke für den Link, aber ganz verstehe ich die Sache immer noch nicht. Woher weiss der Header, was man vorkompilieren will (ich nehme nicht an, sämtliche Funktionen und Klassen). Und wie sollen beispielsweise Templates vorkompiliert werden? Oder wird da einfach bei einer neuen Instanziierung wieder neu kompiliert?



  • Nexus schrieb:

    Danke für den Link, aber ganz verstehe ich die Sache immer noch nicht. Woher weiss der Header, was man vorkompilieren will (ich nehme nicht an, sämtliche Funktionen und Klassen)

    Doch. Der größte Anteil der Zeit geht beim Parsen des Codes drauf. PCH bedeutet gewöhnlich, daß der Compiler den Code parst und seine internen Datenstrukturen in die PCH-Datei persistiert, um sie bei Bedarf einfach laden zu können.



  • Ah okay. Dann ist "vorkompiliert" eigentlich das falsche Wort...
    So versteh ich es auch mit den Templates.

    Noch etwas: In MSVC++ muss man in jedem Modul ein #include "stdafx.h" haben, oder? Kann man das nicht irgendwie vermeiden?



  • Nexus schrieb:

    Ah okay. Dann ist "vorkompiliert" eigentlich das falsche Wort...
    So versteh ich es auch mit den Templates.

    Noch etwas: In MSVC++ muss man in jedem Modul ein #include "stdafx.h" haben, oder? Kann man das nicht irgendwie vermeiden?

    Nein.



  • Also vorkompilierte Header verkürzen die Sache enorm. Ich mache die grundsätzlich in jedem Projekt, da das bereist ab der ersten Datei spürbar ist. (Natürlich wenn man die Header bereits kompiliert hat). Vor allem, wenn man nicht gerade den neusten Computer hat, oder auf einem kleineren Notebook programmiert ist das echt ein Segen.



  • Wenn du mehrere Cores hast, gib MSVC unbedingt das Flag /MPn mit n >= 2 an; so kannst du beim Compilieren parallelisieren. Hilft auch recht, besonders wenn du einen Quad hast^^



  • Gut, vielen Dank für die Hinweise. Dann werde ich in Zukunft wohl auch vermehrt vorkompilierte Header einsetzen.



  • Wegen des /MPn-Flags (bei mir /MP2): Das scheint mit /Gm (minimale Neuerstellung) inkompatibel zu sein. Auch nicht gerade Sinn der Sache...



  • Nexus schrieb:

    Wegen des /MPn-Flags (bei mir /MP2): Das scheint mit /Gm (minimale Neuerstellung) inkompatibel zu sein. Auch nicht gerade Sinn der Sache...

    Ich würde da garnichts umstellen! Habe einen DualCore, und er kompiliert selbstständig zwei Projekte gleichzeitig, wenn es die Abhängigkeiten erlauben. Natürlich inkl. /Gm.



  • z.T. parallel compilieren: Mit dem MPCL Plugin kann man mit Visual Studio hübsch Dateien im selben Projekt parallel compilieren, nicht bloss zwei Projekte parallel:

    http://todobits.es/mpcl.html

    Funktioniert bei mir 1A, und ist sofort und sauber deinstalliert, wenns nicht klappen sollte.


Anmelden zum Antworten