it-swarm.com.de

Wie reduzieren SIE die Kompilierungszeit und die Verknüpfungszeit für Visual C++ - Projekte (natives C++)?

Wie reduzieren SIE die Kompilierungszeit und die Verknüpfungszeit für VC++ - Projekte (natives C++)?

Bitte geben Sie an, ob sich jeder Vorschlag auf Debug, Release oder beides bezieht.

39
Brian R. Bondy

Es mag für Sie offensichtlich klingen, aber wir versuchen, Forward-Deklarationen so weit wie möglich zu verwenden, auch wenn es erforderlich ist, lange Namespace-Namen zu schreiben, in denen sich der Typ befindet/befinden:

// Forward declaration stuff
namespace plotter { namespace logic { class Plotter; } }

// Real stuff
namespace plotter {
    namespace samples {
        class Window {
            logic::Plotter * mPlotter;
            // ...
        };
    }
}

Dies verkürzt die Zeit für das Kompilieren auch auf anderen Compilern erheblich. In der Tat gilt es für alle Konfigurationen :)

Verwenden Sie das Handle/Body-Muster (manchmal auch als "Pimpl", "Adapter", "Dekorateur", "Brücke" oder "Wrapper" bezeichnet). Indem Sie die Implementierung Ihrer Klassen in Ihre CPP-Dateien isolieren, müssen sie nur einmal kompiliert werden. Die meisten Änderungen erfordern keine Änderungen an der Header-Datei, sodass Sie ziemlich umfangreiche Änderungen vornehmen können, während nur eine Datei neu kompiliert werden muss. Dies fördert auch das Umgestalten und Schreiben von Kommentaren und Komponententests, da die Kompilierzeit verkürzt wird. Darüber hinaus trennen Sie automatisch die Belange der Benutzeroberfläche und der Implementierung, sodass die Benutzeroberfläche Ihres Codes vereinfacht wird.

21

Wenn Sie über große komplexe Header verfügen, die in den meisten CPP-Dateien in Ihrem Erstellungsprozess enthalten sein müssen und die nicht sehr oft geändert werden, können Sie sie vorkompilieren. In einem Visual C++ - Projekt mit einer typischen Konfiguration müssen Sie diese lediglich in stdafx.h einfügen. Diese Funktion hat ihre Kritikpunkte, aber Bibliotheken, die Vorlagen voll ausnutzen, enthalten in der Regel viele Informationen in Kopfzeilen. Vorkompilierte Kopfzeilen sind in diesem Fall die einfachste Methode, um Builds zu beschleunigen.

14

Ich verwende Unity Builds (Screencast befindet sich hier ).

8
OJ.

Diese Lösungen gelten sowohl für das Debugging als auch für das Release und konzentrieren sich auf eine Codebasis, die bereits umfangreich und umständlich ist.

Vorwärtserklärungen sind eine gängige Lösung.

Verteiltes Bauen, wie bei Incredibuild, ist ein Gewinn.

Das Verschieben von Code aus Headern nach unten in Quelldateien kann funktionieren. Kleine Klassen, Konstanten, Aufzählungen usw. beginnen möglicherweise in einer Header-Datei, weil sie möglicherweise in mehreren Kompilierungseinheiten verwendet wurden, aber in Wirklichkeit nur in einer verwendet werden und in die CPP-Datei verschoben werden können .

Eine Lösung, über die ich noch nicht gelesen habe, die ich jedoch verwendet habe, besteht darin, große Header zu teilen. Wenn Sie eine Handvoll sehr großer Überschriften haben, schauen Sie sich diese an. Sie können verwandte Informationen enthalten und auch von vielen anderen Headern abhängen. Nehmen Sie die Elemente, die keine Abhängigkeiten von anderen Dateien haben ... einfache Strukturen, Konstanten, Aufzählungen und Forward-Deklarationen und verschieben Sie sie von the_world.h nach the_world_defs.h. Möglicherweise stellen Sie jetzt fest, dass viele Ihrer Quelldateien jetzt nur noch the_world_defs.h enthalten können, und vermeiden Sie es, all diesen Overhead einzuschließen.

Visual Studio verfügt außerdem über die Option "Einschlüsse anzeigen", mit der Sie erkennen können, welche Quelldateien viele Header enthalten und welche Header-Dateien am häufigsten enthalten sind.

Bei sehr häufigen Includes sollten Sie sie in einen vorkompilierten Header einfügen.

8
Drew Dormann

Wir verwenden Xoreax 'Incredibuild , um die Kompilierung parallel auf mehreren Computern auszuführen.

7
crashmstr

Die Frage zur Kompiliergeschwindigkeit ist interessant genug, dass Stroustrup sie in seinem FAQ hat.

7
David Norman

Auch ein interessanter Artikel von Ned Batchelder: http://nedbatchelder.com/blog/200401/speeding_c_links.html (über C++ unter Windows).

5
Paweł Hajdan

Unsere Entwicklungsmaschinen sind alle Quad-Core-Maschinen und wir verwenden Visual Studio 2008, das das parallele Kompilieren unterstützt. Ich bin mir nicht sicher, ob dies in allen VS-Editionen möglich ist.

Wir verfügen über eine Lösungsdatei mit ca. 168 Einzelprojekten. Die Kompilierung auf unseren Quad-Core-Computern dauert ca. 25 Minuten, auf den Single-Core-Laptops, die wir Sommerstudenten geben, ca. 90 Minuten. Nicht genau vergleichbare Maschinen, aber man kommt auf die Idee :)

4
Chris Cameron

In Visual C++ gibt es eine Methode, die als Unity bezeichnet wird und die die Verbindungszeit erheblich verbessert, indem die Anzahl der Objektmodule verringert wird.

Dies beinhaltet die Verkettung des C++ - Codes, normalerweise in Gruppen nach Bibliothek. Dies erschwert natürlich die Bearbeitung des Codes erheblich und führt zu Namespace-Kollisionen, sofern Sie diese nicht ordnungsgemäß verwenden. Es hindert Sie daran, "using namespace foo" zu verwenden.

Mehrere Teams in unserem Unternehmen verfügen über ausgefeilte Systeme, um die normalen C++ - Dateien zur Kompilierungszeit als Build-Schritt zu verketten. Die Verkürzung der Verbindungszeiten kann enorm sein.

2
Matt Shaw

Eine andere nützliche Technik ist das Klecksen. Ich denke, es ist etwas Ähnliches wie das, was Matt Shaw beschrieben hat.

Einfach ausgedrückt, erstellen Sie nur eine CPP-Datei, in die Sie andere CPP-Dateien einfügen. Sie können zwei verschiedene Projektkonfigurationen haben, eine normale und eine Blob-Konfiguration. Natürlich unterliegt das Blobben einigen Einschränkungen für Ihren Code, z. Klassennamen in unbenannten Namespaces können in Konflikt geraten.

Eine Technik, um zu vermeiden, den gesamten Code in einem Blob neu zu kompilieren (wie David Rodríguez sagte), wenn Sie eine CPP-Datei ändern, besteht darin, Ihr "funktionierendes" Blob aus kürzlich geänderten Dateien und anderen normalen Blobs zu erstellen.

Wir verwenden Blobbing die meiste Zeit bei der Arbeit und es reduziert die Projekterstellungszeit, insbesondere die Verbindungszeit.

1
alariq

Kompilierungszeit:
Wenn Sie IncrediBuild haben, ist die Kompilierungszeit kein Problem. Wenn Sie kein IncrediBuild haben, versuchen Sie es mit der "Unity Build" -Methode. Es kombiniert mehrere cpp-Dateien zu einer einzigen cpp-Datei, sodass die gesamte Kompilierungszeit verkürzt wird.
Verbindungszeit:
Die "Unity Build" -Methode trägt ebenfalls zur Verkürzung der Verbindungszeit bei, jedoch nicht zu viel. Sie können jedoch überprüfen, ob "Whole Global Optimization" und "LTCG" aktiviert sind. Diese Flags beschleunigen zwar das Programm, verlangsamen jedoch die Verbindung.
Schalten Sie die "Whole Global Optimization" aus und setzen Sie LTCG auf "Default". Die Verbindungszeit könnte sich um 5/6 verkürzen.
(LTCG steht für Link Time Code Generation)

0
Jeff Jiang