Ich kompiliere 2 C++ - Projekte in einem Buildbot bei jedem Commit. Beide sind ungefähr 1000 Dateien, eine ist 100 Kloc, die andere 170 Kloc. Die Kompilierungszeiten unterscheiden sich stark von denen von gcc (4.4) und Visual C++ (2008).
Visual C++ - Kompilierungen für ein Projekt dauern 20 Minuten. Sie können die vielen Kerne nicht nutzen, da ein Projekt vom anderen abhängt. Am Ende dauert eine vollständige Kompilierung beider Projekte in Debug und Release in 32 und 64 Bit mehr als 2 1/2 Stunden.
gcc-Zusammenstellungen für ein Projekt dauern 4 Minuten. Sie kann auf den 4 Kernen parallelisiert werden und dauert etwa 1 Minute und 10 Sekunden. Alle 8 Builds für 4 Versionen (Debug/Release, 32/64 Bit) der 2 Projekte werden in weniger als 10 Minuten kompiliert.
Was passiert mit Visual C++ - Kompilierungszeiten? Sie sind im Grunde 5-mal langsamer.
Was ist die durchschnittliche Zeit, die erwartet werden kann, um einen C++ - Kloc zu kompilieren? Meins sind 7 s/kloc mit vc ++ und 1,4 s/kloc mit gcc.
Kann etwas getan werden, um die Kompilierungszeiten in Visual C++ zu beschleunigen?
Eine Sache, die den VC++ - Compiler verlangsamt, ist, wenn Sie über eine Headerdatei verfügen, die konkrete Instanzen nicht-trivaler const
-Werttypen initialisiert. Sie können dies mit Konstanten des Typs std::string
oder GUIDs passieren. Dies wirkt sich sowohl auf die Kompilierung als auch auf die Verbindungszeit aus.
Bei einer einzelnen DLL führte dies zu einer 10-fachen Verlangsamung. Dies ist hilfreich, wenn Sie sie in eine vorkompilierte Headerdatei einfügen oder sie einfach in einem Header deklarieren und in einer CPP-Datei initialisieren.
Werfen Sie einen Blick in den Virenscanner und experimentieren Sie mit vorkompilierten Headern, ohne dass Sie VC++ nicht optimal sehen werden.
Ach ja, und stellen Sie sicher, dass sich der Ordner% TMP% auf derselben Partition befindet, in der Ihr Build geschrieben wird, da VC++ temporäre Dateien erstellt und diese später verschiebt.
Die voneinander abhängigen Projekte bedeuten nicht, dass keine Parallelisierung möglich ist. Die Build-Systeme sind klug genug, um kritische Abhängigkeiten zu erkennen und zu vermeiden. Andernfalls könnte gcc nicht 4 Kerne verwenden.
Warum sollten Sie also (zusätzlich zu anderen Schritten) nicht einfach die Multiprocessing-Funktion in Visual Studio mit/MP aktivieren (siehe http://msdn.Microsoft.com/de-de/library/bb385193.aspx ).
Wie erstellen Sie die Visual Studio-Projekte? Laufen Sie gerade die ide (devenv) mit dem Projekt und /build
oder haben Sie ein Makefile, das dem ähnelt, was Sie für gcc verwenden. Ich gehe davon aus, dass beide Builds ein ähnliches Makefile verwenden, aber ich dachte, es lohnt sich zu überprüfen.
Verwenden Sie vorkompilierte Header für einen der beiden Compiler? Wenn Sie keine vorkompilierten Header für VS verwenden, möchten Sie möglicherweise zu deren Verwendung wechseln. Ich persönlich würde die Verwendung des #pragma hdrstop
-Ansatzes anstelle einer einzigen all inclusive-Headerdatei empfehlen. Wenn Sie derzeit jedoch keine vorkompilierten Header verwenden und eine einzelne all inclusive-Headerdatei ausprobieren möchten, die erzwungen wird (mithilfe der Compiler-Befehlszeile /FI
) switch) kann ohne Codeänderungen schnell getestet werden.
Ich habe über /FI
und #pragma hdrstop
hier geschrieben: http://www.lenholgate.com/blog/2004/07/fi-stlport-precompiled-headers-warning-level-4-and-pragma-hdrstop.html
Dies ist nicht die direkte Antwort auf die Frage, aber in meinem Unternehmen verwenden wir IncrediBuild für die verteilte Kompilierung. Dies beschleunigt den Kompilierungsprozess wirklich. http://incredibuild.com/visual_studio.htm
Das Buch "Large-Scale C++ Software Design" von John Lakos enthält viele Tipps zur Strukturierung von Code und Design für große Projekte. Inklusive vielen Tipps zum Beschleunigen der Kompilierung. Nicht direkt mit Visual C++ verwandt, aber trotzdem lesenswert.
Ich habe zwei Artikel über Techniken geschrieben, die die Erstellungszeit reduzieren. Unter diesen Techniken erstellt ein Post auf vorkompilierte Header und Unity-Builds , die Ihnen helfen können, die Kompilierungszeiten zu verbessern. Sie werden mit CMake-Skripts geliefert, die die Techniken transparent behandeln.
Möglicherweise liegt ein Problem mit der Abhängigkeitsprüfung vor, es sei denn, Sie erzwingen einen vollständigen Neuaufbau.
Sie könnten einige statische Bibliotheken erstellen. Fügen Sie Code, der sich selten ändert, in Bibliotheken ein.
Die langsamsten Teile des Programmaufbaus:
Im Allgemeinen sind die Verknüpfungs- und ausführbaren Erstellungsphasen am schnellsten.
Hast du bestimmt:
Denken Sie daran, bei der Bestimmung der Effizienz immer ein Profil (auf die eine oder andere Art) zu erstellen.
In den meisten Fällen können Sie Debug- und Release-Konfigurationen desselben Projekts parallel erstellen.
Das, was Sie beschreiben, klingt furchtbar langsam - Sieht so aus, als würden Sie in VC++ keine vorkompilierten Header verwenden oder diese falsch verwenden - sie dienen insbesondere dazu, die Kompilierungszeit zu verbessern.
Ich weiß nicht, ob dies immer noch ein Problem ist und wie viel Verbesserungen Sie in der Menatime erzielt haben, aber wenn es immer noch vorhanden ist, kann msbuild nicht wissen, wie es innerhalb eines Projekts gleichzeitig orchestriert werden soll (jeder cpp sollte separat aufbaubar sein, es sei denn, Sie haben einige Codegens - Codegens sollten am besten in ein separates Projekt verschoben werden. Sie müssen das Treiberentwicklungskit oder .NET SSCLI herunterladen, da beide über nmake verfügen, das Builds bekanntermaßen gut paralelisieren kann. SSCLI hatte bereits den Build-Build-Setup. Denken Sie daran, wenn DDK einige Build-Beispiele hat, müssen Sie noch bei Null anfangen.
Auch ein bisschen altmodischer Artikel über MSBuild Parallelisierung geht nicht auf Details ein, sondern erwähnt einige Unterschiede zwischen der tatsächlichen msbuild und der msbuild + sln. Wenn/MP vs./Gm das einzige Problem war, müssen Sie möglicherweise ein kleines Skript oder C # -Exe erstellen, um .proj-Dateien für den Lab-Build zu bearbeiten. Oder verwenden Sie die explizite Cmd-Zeilenüberschreibung in Projekten und nehmen Sie diese Option aus einer Env-Variable.
Kompilieren und Verknüpfen einer CPP-Datei gleichzeitig , auch wenn sich Änderungen an der Header-Datei auf mehrere CPP-Dateien auswirken. Dies kann mit dem Visual Studio-Makro erreicht werden:
Dim WithEvents myTimer As Timers.Timer
Sub CompileAndLinkCurrentCppFile()
DTE.ExecuteCommand("Build.Compile")
myTimer = New Timers.Timer
myTimer.Interval = 0.05
myTimer.Start()
End Sub
Sub myTimer_Elapsed(ByVal ee As Object, ByVal dd As Timers.ElapsedEventArgs) Handles myTimer.Elapsed
If DTE.Solution.SolutionBuild.BuildState <> vsBuildState.vsBuildStateInProgress And DTE.Solution.SolutionBuild.LastBuildInfo <> 1 Then
myTimer.Stop()
DTE.ExecuteCommand("Build.Link")
End If
End Sub
Bauen Sie auf derselben Maschine? Verwenden Sie dasselbe Betriebssystem? Beim Vergleichen von GCC in Cygwin und GCC in einer VirtualBox-Maschine, die im Windows-Hosting von Cygwin ausgeführt wird, habe ich Geschwindigkeitsunterschiede im Bereich von 3-10x festgestellt.
Es scheint sehr seltsam, dass es einen solchen Unterschied gibt ... aber es gibt keinen Grund, warum Sie die Multicores auf Visual nicht nutzen können!
Grundsätzlich stehen Ihnen 4 Compilations-Modi zur Verfügung: (Debug/Release) x (32 Bit/64 Bit), von denen jeder völlig unabhängig ist. Sie können die 4 perfekt parallel ausführen und dabei die 4 verfügbaren Kerne voll ausnutzen. Oder probieren Sie einfach den Multi-Prozessor-Ansatz auch in Visual Studio aus.
Das wird es jedoch nicht schneiden. 150 Minuten gegenüber 10 Minuten ist eine große Lücke. Aus meiner persönlichen Erfahrung gibt es zwei Hauptfaktoren, um die Erstellungszeit zu reduzieren: