webentwicklung-frage-antwort-db.com.de

Wie kann ich die Kompilierungszeiten für Visual C++ verbessern?

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?

46
Didier Trosset

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. 

15
user180326

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 ). 

11
jdisk

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

6
Len Holgate

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

6
tommyk

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.

3
Hollance

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.

2
cheind

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:

  1. Dateien öffnen und schließen.
  2. Analysieren und Übersetzen von Quelldateien .

Im Allgemeinen sind die Verknüpfungs- und ausführbaren Erstellungsphasen am schnellsten.

Hast du bestimmt:

  1. welche Phasen sind am langsamsten?
  2. Welche Dateien sind am langsamsten zu kompilieren?

Denken Sie daran, bei der Bestimmung der Effizienz immer ein Profil (auf die eine oder andere Art) zu erstellen.

1
Thomas Matthews

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.

1
sharptooth

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.

0
ZXX

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
0
AareP

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.

0
e8johan

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:

  • alle Dateien auf einer lokalen Festplatte verwenden (ggf. mithilfe der Replikation von Remote-Dateien) und alle lokal erstellten Dateien (.o .so)
  • verwenden Sie alle Kerne, die Ihnen zur Verfügung stehen, und wenn möglich, gehen Sie sogar auf Multi Machines (distcc etc ...)
0
Matthieu M.