22 Stimmen

Wie man die C++-Verknüpfungszeit beschleunigt

Gibt es eine Möglichkeit, die Verknüpfungszeit in MS Visual Studio C++ (2005) zu optimieren? Wir verwenden Xoreax Incredibuild zur Beschleunigung der Kompilierung, aber nichts für die Verknüpfung.

Derzeit dauert jede Verknüpfung etwa 30 Sekunden. Wenn ich das inkrementelle Linken einschalte, dauert es ca. 35-40 Sekunden. ( Egal ob ich das Projekt mit oder ohne incredibuild kompiliere )

Gibt es eine Möglichkeit, wie man Linker profilieren und beobachten kann, wie lange was dauert? Oder ein Werkzeug für Paralell-Linking? Oder irgendwelche Tipps zur Code-Optimierung, um den Linker zu beschleunigen?

Danke für die Antwort Ludek Vodicka


Editar:

Vielen Dank für die ersten Antworten und die zusätzlichen Informationen:

  • Die Optimierung des gesamten Programms und die Generierung von Link-Time-Code sind bereits deaktiviert.
  • PIMPL-Idiom wird bereits verwendet, wenn möglich
  • andere statische Bibliotheken sind bereits über #pragma comment(lib, "pathToLib") eingebunden. (auch wegen der einfacheren Wartung)
  • HW: Quad-Core q6600, 8GB Ram, 3x WD Raptor Raid 0. Windows Vista 64bit

14voto

Brett Douville Punkte 136

Mir sind keine Tools für die parallele Verknüpfung bekannt; ich weiß, dass Incredibuild dies nicht zulässt.

Das wichtigste Werkzeug zur Vermeidung von Verknüpfungszeiten ist die geeignete Abstraktionsebene. Wenn Ihre Verknüpfungszeiten lang sind, liegt das möglicherweise daran, dass Objekte zu viel über andere Objekte wissen. Ihre Entkopplung ist dann der Schlüssel - durch abstrakte Schnittstellen (vielleicht unter Verwendung des PIMPL-Paradigmas) oder durch andere Methoden wie die Ereignisübergabe.

Der Overhead für die Verknüpfung von Projekten über Projektabhängigkeiten ist ebenfalls recht hoch. Wenn Ihre Zielplattform nur oder hauptsächlich Win32 ist, können Sie in Betracht ziehen, einen Header zu verwenden, um Ihre abhängigen Bibliotheken über #pragma comment(lib, "pathToLib") zu linken.

9voto

Ben Schwehn Punkte 4459

Wenn Sie auf die Optimierung verzichten können, schalten Sie die Generierung von Link-Time-Code aus (entfernen Sie den Schalter /GL oder in den Eigenschaften c/c++ -> Optimierung -> Optimierung des gesamten Programms. Für den Linker entfernen Sie /ltcg oder verwenden Sie die Einstellung Link Time Code Generation). Dadurch wird der Compiler allerdings langsamer, da die Codegenerierung jetzt während der Kompilierzeit erfolgt.

Ich habe Projekte gesehen, deren Erstellung mit /GL+/LTCG Stunden dauert, während sie ohne /GL+/LTCG nur Sekunden in Anspruch nehmen (z.B. dieses hier): http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/750ed2b0-0d51-48a3-bd9a-e8f4b544ded8 )

2voto

peterchen Punkte 39679

Haben Sie über eine Verbesserung der Hardware nachgedacht?
Verwenden Sie für die Erstellung eine separate physische Festplatte? Welche Art von Laufwerken verwenden Sie?

Ein allgemeiner Vorschlag: Fügen Sie etwas Speicher hinzu, besorgen Sie eine Velociraptor , dort nur die Quellen und das Build-Verzeichnis eintragen, erneut messen. Wenn das hilft, erwäge ein RAID 0.

Ich habe Berichte gehört, dass das Upgrade von einem XP-Kern auf einen W2K3-Kern die Erstellungszeiten deutlich verbessert hat, vermutlich aufgrund einer besseren Speicherverwaltung und Zwischenspeicherung.

Als Vorschlag zur Änderung Ihres Codes könnten Sie einige Funktionen in eine DLL verlagern und parallel verknüpfen. Aber ich würde eine solche Änderung nicht vornehmen, nur um die Erstellungszeiten zu verbessern.

1voto

Greg Domjan Punkte 13507

Es gibt einige allgemeine Einstellungsvorschläge unter Verbesserung der Verknüpfungszeit mit IncrediBuild

Sie können auch das Linken von statischen Bibliotheken überspringen, wenn Sie sie nicht verteilen wollen, indem Sie IncrediLink

Wir haben festgestellt, dass die Hinzufügung einer Unterschrift nach dem Build-Schritt IncrediBuild daran hindert, an den folgenden Projekten zu arbeiten; das Hinzufügen eines Kommentars zum Post-Build-Schritt sollte helfen

rem IncrediBuild_AllowOverlap

参照 IncrediBuild_AllowOverlap doc

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X