Sehr langsame Kompilierungszeiten in Visual Studio 2005


132

Wir haben sehr langsame Kompilierungszeiten, die auf Dual-Core-2-GHz- und 2-G-Ram-Maschinen mehr als 20 Minuten dauern können.

Ein Großteil davon ist auf die Größe unserer Lösung zurückzuführen, die auf über 70 Projekte angewachsen ist, sowie auf VSS, das ein Flaschenhals für sich ist, wenn Sie viele Dateien haben. (Das Austauschen von VSS ist leider keine Option, daher möchte ich nicht, dass dies zu einer VSS-Bash wird.)

Wir wollen Projekte zusammenführen. Wir streben auch mehrere Lösungen an, um eine bessere Trennung der Bedenken und schnellere Kompilierungszeiten für jedes Element der Anwendung zu erreichen. Ich kann sehen, dass dies eine Hölle für DLLs wird, wenn wir versuchen, die Dinge synchron zu halten.

Ich bin interessiert zu wissen, wie andere Teams mit diesem Skalierungsproblem umgegangen sind. Was tun Sie, wenn Ihre Codebasis eine kritische Masse erreicht, die Sie den halben Tag damit verschwenden, zu beobachten, wie die Statusleiste Kompilierungsnachrichten übermittelt.

UPDATE Ich habe es versäumt zu erwähnen, dass dies eine C # -Lösung ist. Vielen Dank für alle C ++ - Vorschläge, aber es ist ein paar Jahre her, seit ich mir Gedanken über Header machen musste.

BEARBEITEN:

Nette Vorschläge, die bisher geholfen haben (ohne zu sagen, dass es unten keine anderen netten Vorschläge gibt, nur was geholfen hat)

  • Neuer 3-GHz-Laptop - die Leistung der verlorenen Nutzung wirkt Wunder, wenn es um das Management geht
  • Deaktivieren Sie Anti Virus während des Kompilierens
  • 'Trennen' von VSS (eigentlich dem Netzwerk) während des Kompilierens - Ich kann uns veranlassen, die VS-VSS-Integration vollständig zu entfernen und bei der Verwendung der VSS-Benutzeroberfläche zu bleiben

Immer noch nicht durch eine Kompilierung schnupfen, aber jedes bisschen hilft.

Orion erwähnte in einem Kommentar, dass Generika auch ein Stück haben könnten. Aus meinen Tests geht hervor, dass es nur einen minimalen Leistungseinbruch gibt, der jedoch nicht hoch genug ist, um sicherzugehen, dass die Kompilierungszeiten aufgrund der Disc-Aktivität inkonsistent sein können. Aus zeitlichen Gründen enthielten meine Tests nicht so viele Generika oder Code, wie im Live-System angezeigt würden, sodass sich diese möglicherweise ansammeln. Ich würde es nicht vermeiden, Generika dort zu verwenden, wo sie verwendet werden sollen, nur um die Leistung bei der Kompilierung zu gewährleisten

Umgehung

Wir testen die Praxis, neue Anwendungsbereiche in neuen Lösungen zu erstellen, die neuesten DLLs nach Bedarf zu importieren und sie in die größere Lösung zu integrieren, wenn wir mit ihnen zufrieden sind.

Wir können sie auch für vorhandenen Code verwenden, indem wir temporäre Lösungen erstellen, die nur die Bereiche zusammenfassen, an denen wir arbeiten müssen, und sie nach der Wiedereingliederung des Codes wegwerfen. Wir müssen die Zeit abwägen, die für die Wiedereingliederung dieses Codes benötigt wird, gegen die Zeit, die wir gewinnen, wenn wir keine Rip Van Winkle-ähnlichen Erfahrungen mit der schnellen Neukompilierung während der Entwicklung haben.


Wow, ich dachte, 20 Sekunden Kompilierungszeiten wären ärgerlich lang.
Jared Updike

Versuchen Sie, möglichst mehrere Lösungen zu vermeiden, da das Refactoring so viel schwieriger wird.
Ian Ringrose

Sie können VSS auch außerhalb von Visual Studio verwenden, sodass Sie nicht den Aufwand haben, wenn Visual Studio mit VSS spricht.
Ian Ringrose

Wie wäre es mit den Ressourcen? Ich kann mir vorstellen, dass sie den Prozess verlangsamen. Ich habe kommerzielle Software mit Exe-Dateien von der Größe von CDs gesehen, die Sie von CD starten (nicht eingerichtet). Sie waren voller Videos, Audio und Bilder. Die Software war also nur diese eine Datei ...
Bitterblue

Antworten:


74

Das Chromium.org-Team listete verschiedene Optionen zur Beschleunigung des Builds auf (zu diesem Zeitpunkt etwa in der Mitte der Seite):

In absteigender Reihenfolge der Beschleunigung:

  • Installieren Sie den Microsoft Hotfix 935225 .
  • Installieren Sie den Microsoft Hotfix 947315 .
  • Verwenden Sie einen echten Multicore-Prozessor (z. B. einen Intel Core Duo 2; keinen Pentium 4 HT).
  • Verwenden Sie 3 parallele Builds. In Visual Studio 2005 finden Sie die Option unter Extras> Optionen ...> Projekte und Lösungen> Erstellen und Ausführen> Maximale Anzahl paralleler Projekterstellungen .
  • Deaktivieren Sie Ihre Antivirensoftware für .ilk-, .pdb-, .cc-, .h-Dateien und suchen Sie nur beim Ändern nach Viren . Deaktivieren Sie das Scannen des Verzeichnisses, in dem sich Ihre Quellen befinden. Mach nichts Dummes.
  • Speichern und erstellen Sie den Chromium-Code auf einer zweiten Festplatte. Es wird den Build nicht wirklich beschleunigen, aber zumindest wird Ihr Computer reagieren, wenn Sie gclient synchronisieren oder einen Build durchführen.
  • Defragmentieren Sie Ihre Festplatte regelmäßig.
  • Deaktivieren Sie den virtuellen Speicher.

30
Mit Deaktivieren des virtuellen Speichers meine ich das Deaktivieren des Austauschs. Das Deaktivieren des virtuellen Speichers würde ein Umschreiben des gesamten Betriebssystems erfordern. P
Joseph Garvin

9
Dies sieht aus wie eine Antwort, die auf C ++ - Builds und nicht auf C #
Ian Ringrose,

2
Du hast recht! Obwohl ich darauf hinweisen sollte, dass ich geantwortet habe, bevor er C # angegeben hat, und einige der Korrekturen immer noch zutreffen.
Nate

* Speichern Sie das Projekt auf einem SSD-Laufwerk. * Deaktivieren Sie die Windows-Indizierung (klicken Sie in einem Dateimanager mit der rechten Maustaste auf Lösungsordner, Eigenschaften-> Erweitert, deaktivieren Sie das Kontrollkästchen "Dateien zulassen ... indiziert ...")
Nr.

+1 Wenn Sie genug RAM haben, behalten Sie das Projekt auf der RAM-Disk. Es kann die Leistung dramatisch um bis zu 50-70% verbessern. überprüfen codeproject.com/Articles/197663/Speed-up-Visual-Studio-Builds für weitere Informationen
Arjun Vachhani

58

Wir haben fast 100 Projekte in einer Lösung und eine Entwicklungszeit von nur Sekunden :)

Für die lokale Entwicklung baut wir ein Visual Studio Addin , dass Änderungen erstellt Project referencesauf DLL referencesund entlädt die unerwünschten Projekte (und eine Option , um sie natürlich zurück zu wechseln).

  • Erstellen Sie unsere gesamte Lösung einmal
  • Entladen Sie die Projekte, an denen wir gerade nicht arbeiten, und ändern Sie alle Projektreferenzen in DLL-Referenzen.
  • Ändern Sie vor dem Einchecken alle Referenzen von der DLL zurück in die Projektreferenzen.

Unsere Builds dauern nur noch Sekunden, wenn wir nur an wenigen Projekten gleichzeitig arbeiten. Wir können die zusätzlichen Projekte auch weiterhin debuggen, da sie mit den Debug-DLLs verknüpft sind. Das Tool benötigt normalerweise 10 bis 30 Sekunden, um eine große Anzahl von Änderungen vorzunehmen, aber Sie müssen dies nicht so oft tun.

Update Mai 2015

Der Deal, den ich gemacht habe (in den Kommentaren unten), war, dass ich das Plugin für Open Source veröffentlichen würde, wenn es genug Interesse bekommt. 4 Jahre später hat es nur 44 Stimmen (und Visual Studio hat jetzt zwei nachfolgende Versionen), so dass es derzeit ein Projekt mit niedriger Priorität ist.


2
Verwendete auch diese Technik mit einer Lösung mit 180 Projekten. Das hat sehr geholfen. Sie können sogar die Befehlszeile verwenden, um die gesamte Lösung `devenv.exe / build yoursolution / takealookatthedoc`` zu erstellen. Sie arbeiten also mit nur wenigen Projekten und kompilieren bei Bedarf die gesamte Lösung in einer cmd-Zeile neu (nach a Holen Sie sich die neueste Version zum Beispiel)
Steve B

Haben Sie Links, die beschreiben, wie das gemacht wird? Ich meine nicht, ein VS-Plugin zu schreiben. Vielmehr die spezifischen Aufgaben beschrieben
Daniel Dyson

@ Daniel Dyson: Wie detailliert müssen Sie wissen? Es kommt darauf an, 1) alle entladenen Projekte zu laden 2) die Lösungs- / Projekt- / Referenzhierarchie zu iterieren 3) Projekte mit Verweisen auf andere Projekte zu finden 4) die "ausgewählten" Verweise auf DLL-Verweise (mit korrekten Hinweispfaden) zu ändern und dann 5) Entladen der unerwünschten Projekte. "Ausgewählt" erfolgt entweder über das Inhaltsmenü (dh die ausgewählten Projekte) oder über einen Kontrollkästchenbaum, um Elemente auszuwählen.
Gone Coding

Vielen Dank. Das sollte ausreichen, um mich anzufangen.
Daniel Dyson

1
@ HiTechMagic Ah, tut mir leid das zu hören. Aber ja, wenn wir es als Open Source veröffentlichen, können wir alle helfen. Bitte poste den Github-Link hier, wenn du ihn freigibst.
Georgiosd

24

Ich hatte ein ähnliches Problem mit einer Lösung mit 21 Projekten und 1/2 Million LOC. Der größte Unterschied bestand darin, schnellere Festplatten zu bekommen. Vom Leistungsmonitor aus wird der 'Durchschn. Disk Queue 'sprang auf dem Laptop deutlich nach oben, was darauf hinwies, dass die Festplatte der Flaschenhals war.

Hier sind einige Daten für die gesamten Wiederherstellungszeiten ...

1) Laptop, Core 2 Duo 2 GHz, Laufwerk mit 5400 U / min (Cache nicht sicher. War Standard Dell Inspiron).

Wiederherstellungszeit = 112 Sekunden.

2) Desktop (Standardausgabe), Core 2 Duo 2,3 GHz, einzelner 8-MB-Cache mit 7200 U / min.

Wiederherstellungszeit = 72 Sekunden.

3) Desktop Core 2 Duo 3 GHz, einzelner WD Raptor mit 10000 U / min

Wiederherstellungszeit = 39 Sekunden.

Das Laufwerk mit 10.000 U / min ist nicht zu unterschätzen. Builds, bei denen die Verwendung des Datei-Explorers wesentlich schneller und alles andere wie das Anzeigen von Dokumentation war, waren schneller spürbar. Es war eine große Produktivitätssteigerung durch die Beschleunigung des Code-Build-Run-Zyklus.

Angesichts der Ausgaben der Unternehmen für Entwicklergehälter ist es verrückt, wie viel sie verschwenden können, um sie mit denselben PCs auszustatten, die die Rezeptionistin verwendet.


4
Wie würde sich eine SSD mit dem Raptor vergleichen lassen? Noch schneller ich denke
RvdK

4
Jep. Mein Laptop mit einem Intel X25M ist in jeder Hinsicht schneller als mein Desktop mit einem WD Raptor.
CAD Kerl

4
Es mag überraschend klingen, aber es lohnt sich derzeit nicht, in ein Laufwerk mit 10000 U / min zu investieren. Der Grund ist, dass die besseren Antriebe mit 7200 U / min am äußeren Rand schneller sind. Man muss also eine kleine Partition erstellen. Die erste Partition befindet sich am äußeren Rand. Diese Partition ist schneller als ein Laufwerk mit 7200 U / min. Außerdem haben Sie noch Platz für eine zweite große Partition, auf der Sie Dinge speichern können.
Darklon

2
@cornelius: Kann ich einen Link bekommen, der Ihren Standpunkt näher erläutert? Der einzige Weg, wie der äußere Rand eines 7200 schneller sein könnte als der äußere Rand eines 10000, wäre, wenn der 7200 einen Radius hätte, was vielleicht sein könnte, aber dieser Trick wäre wirklich eine Art Hack und würde keinen Nutzen bringen für den Rest des Festplattenspeichers auf dem 7200, der unterhalb des Gleichgewichtsradius liegt, bei dem die beiden Laufwerke die gleiche Tangentialgeschwindigkeit haben.
Eremzeit

2
Ich bin bei CADbloke. Wir haben Raptoren verwendet, bis der Preis für SSDs im letzten Jahr so ​​weit gesunken ist, dass wir SSDs nur für die primären Laufwerke in unseren Laptops / Desktops verwenden. Die Geschwindigkeitssteigerung ist fantastisch und ist mit Sicherheit der größte Faktor dafür, wie lange es dauert, unsere Lösungen zu kompilieren.
NotMe

16

Für C # .NET-Builds können Sie .NET Demon verwenden . Es ist ein Produkt, das den Visual Studio-Erstellungsprozess übernimmt, um ihn schneller zu machen.

Dazu werden die von Ihnen vorgenommenen Änderungen analysiert und nur das tatsächlich erstellte Projekt sowie andere Projekte erstellt, die sich tatsächlich auf die von Ihnen vorgenommenen Änderungen verlassen haben. Das heißt, wenn Sie nur internen Code ändern, muss nur ein Projekt erstellt werden.


Ist es nicht das, was VS bereits tut? Oder meinst du, irrelevante Änderungen wie Kommentare usw. werden verworfen?
Nawfal

1
Redgate hat die Arbeit an .net Demon leider eingestellt, so dass es nicht über VS 2013
Robert Ivanc

14

Schalten Sie Ihr Antivirenprogramm aus. Es verlängert die Kompilierungszeit um Alter.


2
... für den Code / Compile-Ordner. Das Ausschalten des AV-Schutzes als Regel für die pauschale Abdeckung ist keine brillante Idee. : o)
Brett Rigby

5
Sie müssen es nicht wirklich ausschalten, normalerweise reicht es aus, es richtig zu konfigurieren. Fügen Sie Ausnahmen zu den Dateitypen hinzu, mit denen der Compiler / Linker arbeitet. Bei einigen Antivirenpaketen werden diese Ausnahmen standardmäßig hinzugefügt, bei anderen nicht.
Darklon

@cornelius Was ist die richtige Antiviren-Konfiguration? Können Sie Details angeben? (Vielleicht in einer separaten Frage?)
Pavel Radzivilovsky

@Pavel: Nun, schließen Sie Dateitypen aus, mit denen der Compiler arbeitet, für C ++ wären das Dinge wie .o, .pdb, .ilk, .lib, .cpp, .h. Mit einigen Antivirensoftwareprogrammen (z. B. Avira AntiVir) können Sie außerdem festlegen, dass Dateien beim Lesen, Schreiben oder bei beiden gescannt werden. Wenn Sie es so einstellen, dass es beim Lesen scannt, erhalten Sie 99% Schutz.
Darklon

12

Verwenden Sie die verteilte Kompilierung. Xoreax IncrediBuild kann die Kompilierungszeit auf wenige Minuten reduzieren .

Ich habe es auf einer riesigen C \ C ++ - Lösung verwendet, deren Kompilierung normalerweise 5-6 Stunden dauert. IncrediBuild hat dazu beigetragen, diese Zeit auf 15 Minuten zu reduzieren.


Durch die Installation von IncrediBuild auf mehreren Ersatz-PCs konnte die Kompilierungszeit für unser C ++ - Projekt um fast den Verwaltungsaufwand um den Faktor 10 oder mehr reduziert werden.
Stiefel

hatte die gleiche Erfahrung aku ... aber Link war immer noch ein Problem hehe
Paul Carroll

Wenn Sie diesen Weg gehen, würde es funktionieren, einfach ein paar dedizierte Build-Server zu haben. Es sieht jedoch so aus, als ob das OP versucht hat, die Build-Zeiten auf den lokalen Entwicklungscomputern zu korrigieren.
NotMe

11

Anweisungen zum Reduzieren der Visual Studio-Kompilierungszeit auf einige Sekunden

Visual Studio ist leider nicht intelligent genug, um die Schnittstellenänderungen einer Assembly von unwichtigen Änderungen des Codekörpers zu unterscheiden. Diese Tatsache kann in Kombination mit einer großen, miteinander verflochtenen Lösung manchmal fast jedes Mal, wenn Sie eine einzelne Codezeile ändern, einen perfekten Sturm unerwünschter "vollständiger Builds" erzeugen.

Eine Strategie, um dies zu überwinden, besteht darin, die automatischen Referenzbaum-Builds zu deaktivieren. Verwenden Sie dazu den 'Configuration Manager' (Build / Configuration Manager ... und wählen Sie dann in der Dropdown-Liste Active Solution Configuration die Option 'New'), um eine neue Build-Konfiguration mit dem Namen 'ManualCompile' zu erstellen, die aus der Debug-Konfiguration kopiert wird Aktivieren Sie nicht das Kontrollkästchen "Neue Projektkonfigurationen erstellen". Deaktivieren Sie in dieser neuen Build-Konfiguration jedes Projekt, damit keines automatisch erstellt wird. Speichern Sie diese Konfiguration, indem Sie auf "Schließen" klicken. Diese neue Build-Konfiguration wird Ihrer Lösungsdatei hinzugefügt.

Sie können von einer Build-Konfiguration zu einer anderen über die Dropdown-Liste Build-Konfiguration oben auf Ihrem IDE-Bildschirm wechseln (die normalerweise entweder 'Debug' oder 'Release' anzeigt). Diese neue ManualCompile-Build-Konfiguration macht die Build-Menüoptionen für: 'Build Solution' oder 'Rebuild Solution' praktisch unbrauchbar. Wenn Sie sich im manuellen Kompilierungsmodus befinden, müssen Sie jedes zu ändernde Projekt manuell erstellen. Klicken Sie dazu im Projektmappen-Explorer mit der rechten Maustaste auf jedes betroffene Projekt und wählen Sie dann "Erstellen" oder "Neu erstellen". Sie sollten sehen, dass Ihre gesamten Kompilierungszeiten nur noch Sekunden betragen.

Damit diese Strategie funktioniert, muss die in den AssemblyInfo- und GlobalAssemblyInfo-Dateien enthaltene Versionsnummer auf dem Entwicklercomputer statisch bleiben (natürlich nicht während der Release-Builds) und dass Sie Ihre DLLs nicht signieren.

Ein potenzielles Risiko bei der Verwendung dieser ManualCompile-Strategie besteht darin, dass der Entwickler möglicherweise vergisst, die erforderlichen Projekte zu kompilieren. Wenn er den Debugger startet, werden unerwartete Ergebnisse angezeigt (Debugger kann nicht angehängt werden, Dateien wurden nicht gefunden usw.). Um dies zu vermeiden, ist es wahrscheinlich am besten, die Build-Konfiguration 'Debug' zu verwenden, um einen größeren Codierungsaufwand zu kompilieren, und die Build-Konfiguration ManualCompile nur während des Komponententests oder zum Vornehmen schneller Änderungen zu verwenden, die nur einen begrenzten Umfang haben.


8

Wenn dies C oder C ++ ist und Sie keine vorkompilierten Header verwenden, sollten Sie dies tun.


Wenn vorkompilierte Header für Sie funktionieren, sind sie ein guter Trick, aber sie funktionieren nur, wenn Sie eine starke gemeinsame Teilmenge von Headern erstellen können, die sich selten ändern. Wenn Sie die Header die meiste Zeit, die Sie erstellen, immer wieder vorkompilieren müssen, speichern Sie nichts.
Tom Swirly

7

Wir hatten mehr als 80 Projekte in unserer Hauptlösung, deren Erstellung ungefähr 4 bis 6 Minuten dauerte, je nachdem, welche Art von Maschine ein Entwickler arbeitete. Wir hielten das für viel zu lang: Für jeden einzelnen Test werden Ihre Vollzeitstellen wirklich aufgefressen.

Wie kann man schnellere Bauzeiten erzielen? Wie Sie anscheinend bereits wissen, ist es die Anzahl der Projekte, die die Bauzeit wirklich beeinträchtigen. Natürlich wollten wir nicht alle unsere Projekte loswerden und einfach alle Quelldateien in eine werfen. Wir hatten jedoch einige Projekte, die wir dennoch kombinieren konnten: Da jedes "Repository-Projekt" in der Lösung ein eigenes unittest-Projekt hatte, haben wir einfach alle unittest-Projekte zu einem global-unittest-Projekt zusammengefasst. Das reduzierte die Anzahl der Projekte mit ungefähr 12 Projekten und sparte irgendwie 40% der Zeit, um die gesamte Lösung zu erstellen.

Wir denken jedoch über eine andere Lösung nach.

Haben Sie auch versucht, eine neue (zweite) Lösung mit einem neuen Projekt einzurichten? Diese zweite Lösung sollte einfach alle Dateien mithilfe von Lösungsordnern enthalten. Weil Sie vielleicht überrascht sein werden, wie lange diese neue Lösung mit nur einem Projekt erstellt wurde.

Die Arbeit mit zwei verschiedenen Lösungen erfordert jedoch einige sorgfältige Überlegungen. Entwickler könnten dazu neigen, tatsächlich an der zweiten Lösung zu arbeiten und die erste vollständig zu vernachlässigen. Da die erste Lösung mit mehr als 70 Projekten die Lösung ist, die sich um Ihre Objekthierarchie kümmert, sollte dies die Lösung sein, bei der Ihr Buildserver alle Ihre Unittests ausführen sollte. Der Server für die kontinuierliche Integration muss also das erste Projekt / die erste Lösung sein. Sie müssen Ihre Objekthierarchie beibehalten, richtig.

Die zweite Lösung mit nur einem Projekt (das viel schneller erstellt wird) ist das Projekt, bei dem alle Entwickler Tests und Debugging durchführen. Sie müssen sich jedoch darum kümmern, dass sie sich den Buildserver ansehen! Wenn etwas kaputt geht, MUSS es repariert werden.


7

Stellen Sie sicher, dass Ihre Referenzen Projektreferenzen sind und nicht direkt auf die DLLs in den Bibliotheksausgabeverzeichnissen.

Stellen Sie außerdem sicher, dass diese nicht lokal kopiert werden, es sei denn, dies ist unbedingt erforderlich (Das Master-EXE-Projekt).


Können Sie erklären, warum dies schneller ist? "Projektreferenzen" impliziert die Projekterstellung (die viel langsamer ist als eine direkte DLL-Referenz).
Gone Coding

6

Ich habe diese Antwort ursprünglich hier gepostet: /programming/8440/visual-studio-optimizations#8473 Auf dieser Seite finden Sie viele weitere hilfreiche Hinweise.

Wenn Sie Visual Studio 2008 verwenden, können Sie mit dem Flag / MP kompilieren, um ein einzelnes Projekt parallel zu erstellen. Ich habe gelesen, dass dies auch eine undokumentierte Funktion in Visual Studio 2005 ist, habe mich aber nie selbst ausprobiert.

Sie können mehrere Projekte parallel erstellen, indem Sie das Flag / M verwenden. Dies ist jedoch normalerweise bereits auf die Anzahl der verfügbaren Kerne auf dem Computer festgelegt, obwohl dies meines Erachtens nur für VC ++ gilt.


1
Achtung. 2008 gibt es einen Fehler, der Builds abschneidet. MS sagen, dass sie nicht vor vs2010 beheben werden. Dies ist ein schreckliches Problem, da es .obj-Dateien abschneidet, was zu anhaltenden verwirrenden Build-Problemen führt. du wurdest gewarnt. ;) social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/…
Justin

6

Ich stelle fest, dass diese Frage uralt ist, aber das Thema ist heute noch von Interesse. Das gleiche Problem hat mich in letzter Zeit beschäftigt, und die beiden Dinge, die die Build-Leistung am meisten verbessert haben, waren: (1) Verwenden einer dedizierten (und schnellen) Festplatte zum Kompilieren und (2) Verwenden des gleichen Ausgabeordners für alle Projekte und Setzen von CopyLocal auf False für das Projekt Verweise.

Einige zusätzliche Ressourcen:


5

Einige Analysewerkzeuge:

tools-> options-> VC ++ - Projekteinstellungen -> Build Timing = Ja gibt die Build-Zeit für jedes vcproj an.

Fügen Sie /Btder Compiler-Befehlszeile einen Schalter hinzu, um zu sehen, wie viel jede CPP-Datei benötigt hat

Verwenden Sie /showIncludesdiese Option , um verschachtelte Includes (Header-Dateien, die andere Header-Dateien enthalten) abzufangen und mithilfe von Forward-Deklarationen zu ermitteln, welche Dateien viel E / A speichern können.

Auf diese Weise können Sie die Compilerleistung optimieren, indem Sie Abhängigkeiten und Leistungsprobleme beseitigen.


5

Bevor Sie Geld für Investitionen in schnellere Festplatten ausgeben, sollten Sie versuchen, Ihr Projekt vollständig auf einer RAM-Disk zu erstellen (vorausgesetzt, Sie haben genügend RAM zur Verfügung). Sie finden verschiedene kostenlose RAM-Disk-Treiber im Internet. Sie werden kein physisches Laufwerk finden, einschließlich SSDs, das schneller als eine RAM-Disk ist.

In meinem Fall wurde ein Projekt, dessen Aufbau auf einem 6-Core-i7 auf einem SATA-Laufwerk mit 7200 U / min und Incredibuild 5 Minuten dauerte, mithilfe einer RAM-Disk nur um etwa 15 Sekunden reduziert. In Anbetracht der Notwendigkeit, erneut in einen permanenten Speicher zu kopieren, und des Potenzials für verlorene Arbeit sind 15 Sekunden kein ausreichender Anreiz, eine RAM-Disk zu verwenden, und wahrscheinlich kein großer Anreiz, mehrere Hundert Dollar für ein Laufwerk mit hoher Drehzahl oder SSD auszugeben.

Der kleine Gewinn kann darauf hinweisen, dass der Build CPU-gebunden war oder dass das Zwischenspeichern von Windows-Dateien ziemlich effektiv war. Da beide Tests jedoch in einem Zustand durchgeführt wurden, in dem die Dateien nicht zwischengespeichert wurden, neige ich stark zu CPU-gebundenen Kompilierungen.

Abhängig vom tatsächlichen Code, den Sie zusammenstellen, kann Ihr Kilometerstand variieren. Zögern Sie also nicht, ihn zu testen.


RAM-Festplatten helfen meiner Erfahrung nach nicht beim Erstellen von VS-Zeiten, und sie sind schmerzhaft, da Sie sie jedes Mal neu erstellen müssen, wenn Ihr Computer neu startet oder abstürzt. Siehe Blog-Beitrag hier: josephfluckiger.blogspot.com/2009/02/…
BrokeMyLegBiking

3

Wie groß ist Ihr Build-Verzeichnis nach einem vollständigen Build? Wenn Sie sich an das Standard-Setup halten, kopiert jede Assembly, die Sie erstellen, alle DLLs ihrer Abhängigkeiten und Abhängigkeiten usw. in ihr bin-Verzeichnis. In meinem vorherigen Job bei der Arbeit mit einer Lösung von ~ 40 Projekten stellten meine Kollegen fest, dass der mit Abstand teuerste Teil des Erstellungsprozesses darin bestand, diese Assemblys immer wieder zu kopieren, und dass ein Build Gigabyte Kopien derselben DLLs über und generieren konnte erneut.

Hier einige nützliche Ratschläge von Patrick Smacchia, Autor von NDepend, darüber, was seiner Meinung nach separate Baugruppen sein sollten und was nicht:

http://codebetter.com/patricksmacchia/2008/12/08/advices-on-partitioning-code-through-net-assemblies/

Grundsätzlich gibt es zwei Möglichkeiten, wie Sie dies umgehen können, und beide haben Nachteile. Eine besteht darin, die Anzahl der Baugruppen zu reduzieren, was offensichtlich viel Arbeit bedeutet. Eine andere Möglichkeit besteht darin, Ihre Build-Verzeichnisse so umzustrukturieren, dass alle Bin-Ordner konsolidiert werden und Projekte die DLLs ihrer Abhängigkeiten nicht kopieren. Dies ist nicht erforderlich, da sich alle bereits im selben Verzeichnis befinden. Dies reduziert die Anzahl der Dateien, die während eines Builds erstellt und kopiert werden, erheblich. Die Einrichtung kann jedoch schwierig sein und es kann schwierig sein, nur die DLLs abzurufen, die für eine bestimmte ausführbare Datei zum Packen erforderlich sind.


Ich habe den Job verlassen, dass dies vor einiger Zeit ein Problem war, aber in meiner neuen Position haben wir genau dies umgesetzt! Prost. JC
Johnc

2

Nehmen Sie vielleicht einige gemeinsame Funktionen und erstellen Sie einige Bibliotheken. Auf diese Weise werden dieselben Quellen nicht für mehrere Projekte immer wieder kompiliert.

Wenn Sie befürchten, dass verschiedene Versionen von DLLs verwechselt werden, verwenden Sie statische Bibliotheken.


Die DLL (und ihre verschiedenen Cousins ​​mögen gemeinsam genutzte Bibliotheken) ist heutzutage für einen Anwendungsentwickler fast immer eine schlechte Idee. Ausführbare Dateien sind klein, selbst wenn Sie in jeder zuletzt verwendeten Bibliothek eine Verknüpfung herstellen und der Speicherplatz, den Sie durch die gemeinsame Nutzung des Codes sparen, ebenfalls gering ist. DLLs erinnern an die Zeit, als der Programmcode-Speicherbedarf im Speicher und auf der Festplatte von zentraler Bedeutung war, aber die Größe von Daten, Speicher und Festplatte viel schneller gewachsen ist als die Größe von Programmen.
Tom Swirly

2

Deaktivieren Sie die VSS-Integration. Möglicherweise haben Sie keine Wahl, aber DLLs werden "versehentlich" ständig umbenannt ...

Und überprüfen Sie auf jeden Fall Ihre vorkompilierten Header-Einstellungen. Bruce Dawsons Leitfaden ist etwas alt, aber immer noch sehr gut - sehen Sie sich das an: http://www.cygnus-software.com/papers/precompiledheaders.html


Natürlich können wir die Integration in VSS deaktivieren und stattdessen über die Source Safe-Benutzeroberfläche steuern. Netter Gedanke
Johnc

2

Ich habe ein Projekt, das 120 oder mehr Exes, Libs und DLLs hat und dessen Erstellung viel Zeit in Anspruch nimmt. Ich verwende einen Baum von Batch-Dateien, die make-Dateien aus einer Master-Batch-Datei aufrufen. Ich hatte in der Vergangenheit Probleme mit seltsamen Dingen aus inkrementellen (oder temperamentvollen) Headern, deshalb vermeide ich sie jetzt. Ich mache selten einen vollständigen Build und lasse ihn normalerweise bis zum Ende des Tages, während ich eine Stunde spazieren gehe (also kann ich nur vermuten, dass es ungefähr eine halbe Stunde dauert). Ich verstehe also, warum das zum Arbeiten und Testen nicht funktioniert.

Zum Arbeiten und Testen habe ich für jede App (oder jedes Modul oder jede Bibliothek) einen anderen Satz von Batch-Dateien, in denen auch alle Debugging-Einstellungen vorhanden sind - diese nennen jedoch immer noch dieselben make-Dateien. Ich kann DEBUG von Zeit zu Zeit ein- oder ausschalten und mich auch für Builds oder Marken entscheiden oder ob ich auch Bibliotheken erstellen möchte, von denen das Modul abhängig sein kann, und so weiter.

Die Batchdatei kopiert auch das fertige Ergebnis in die (oder mehrere) Testordner. Abhängig von den Einstellungen dauert dies einige Sekunden bis eine Minute (im Gegensatz zu einer halben Stunde).

Ich habe eine andere IDE (Zeus) verwendet, da ich gerne die Kontrolle über .rc-Dateien habe und es eigentlich vorziehe, über die Befehlszeile zu kompilieren, obwohl ich MS-Kompatibilitäten verwende.

Gerne veröffentlichen wir ein Beispiel für diese Batch-Datei, wenn jemand interessiert ist.


2

Deaktivieren Sie die Dateisystemindizierung für Ihre Quellverzeichnisse (insbesondere die obj-Verzeichnisse, wenn Ihre Quelle durchsuchbar sein soll).



1

Möglicherweise möchten Sie auch nach zirkulären Projektreferenzen suchen. Es war einmal ein Problem für mich.

Das ist:

Projekt A verweist auf Projekt B.

Projekt B verweist auf Projekt C.

Projekt C verweist auf Projekt A.


1
Wenn dies der Fall wäre, würde die Lösung niemals kompiliert werden.
Michael

@Michael wird kompiliert, wenn Sie auf DLLs im Debug-Verzeichnis verweisen, anstatt Projektreferenzen zu verwenden.
Caleb Jares

1

Eine billigere Alternative zu Xoreax IB ist die Verwendung von Uber-File-Builds. Es ist im Grunde eine .cpp-Datei, die hat

#include "file1.cpp"
#include "file2.cpp"
....
#include "fileN.cpp"

Dann kompilieren Sie die Uber-Einheiten anstelle der einzelnen Module. Wir haben Kompilierungszeiten von 10-15 Minuten bis 1-2 Minuten gesehen. Möglicherweise müssen Sie herausfinden, wie viele #includes pro uber-Datei sinnvoll sind. Kommt auf die Projekte an. usw. Vielleicht enthalten Sie 10 Dateien, vielleicht 20.

Sie zahlen Kosten, also Vorsicht:

  1. Sie können nicht mit der rechten Maustaste auf eine Datei klicken und "kompilieren ..." sagen, da Sie die einzelnen CPP-Dateien vom Build ausschließen und nur die Uber-CPP-Dateien einschließen müssen
  2. Sie müssen auf statische globale Variablenkonflikte achten.
  3. Wenn Sie neue Module hinzufügen, müssen Sie die Uber-Dateien auf dem neuesten Stand halten

Es ist eine Art Schmerz, aber für ein Projekt, das in Bezug auf neue Module weitgehend statisch ist, könnte sich der anfängliche Schmerz lohnen. Ich habe gesehen, wie diese Methode in einigen Fällen IB schlug.


1

Wenn es sich um ein C ++ - Projekt handelt, sollten Sie vorkompilierte Header verwenden. Dies macht einen großen Unterschied in den Kompilierungszeiten. Nicht sicher, was cl.exe wirklich tut (ohne vorkompilierte Header zu verwenden), scheint es zu suchen vielen STL-Headern an den falschen Stellen bevor Sie schließlich an den richtigen Ort gehen. Dadurch werden jeder kompilierten CPP-Datei ganze Sekunden hinzugefügt. Ich bin mir nicht sicher, ob dies ein cl.exe-Fehler oder ein STL-Problem in VS2008 ist.


1

Ist die Maschine, auf der Sie aufbauen, optimal konfiguriert?

Wir haben gerade unsere Bauzeit für unser größtes C ++ - Produkt im Unternehmensmaßstab von 19 Stunden verkürzt auf 16 Minuten verkürzt, indem sichergestellt haben, dass der richtige SATA-Filtertreiber installiert wurde.

Subtil.


Die Fahrgeschwindigkeit ist sicherlich ein Faktor
Johnc

Nicht optimal konfiguriert. 2 GB RAM sind viel zu wenig, um damit zu beginnen.
TomTom

1

In Visual Studio 2005 gibt es einen undokumentierten / MP-Schalter (siehe http://lahsiv.net/blog/?p=40) , der eine parallele Kompilierung auf Dateibasis und nicht auf Projektbasis ermöglicht. Dies kann das Kompilieren des letzten Projekts beschleunigen oder wenn Sie ein Projekt kompilieren.


1

Bei der Auswahl einer CPU: Die Größe des L1-Cache scheint einen großen Einfluss auf die Kompilierungszeit zu haben. Außerdem ist es normalerweise besser, 2 schnelle Kerne als 4 langsame zu haben. Visual Studio nutzt die zusätzlichen Kerne nicht sehr effektiv. (Ich stütze mich dabei auf meine Erfahrung mit dem C ++ - Compiler, aber es gilt wahrscheinlich auch für den C # 1.)


1

Ich bin jetzt auch davon überzeugt, dass es ein Problem mit VS2008 gibt. Ich verwende es auf einem Dual-Core-Intel-Laptop mit 3G-RAM und ausgeschaltetem Antivirenprogramm. Das Kompilieren der Lösung ist oft recht einfach, aber wenn ich das Debuggen durchgeführt habe, wird eine nachfolgende Neukompilierung oft zu einem Crawl verlangsamt. Aus dem Dauerlicht der Hauptfestplatte geht hervor, dass ein Festplatten-E / A-Engpass vorliegt (Sie können ihn auch hören). Wenn ich das Erstellen und Herunterfahren gegen VS abbreche, wird die Festplattenaktivität beendet. Starten Sie VS neu, laden Sie die Lösung neu und erstellen Sie sie neu. Das geht viel schneller. Unitl das nächste Mal

Ich bin der Meinung, dass dies ein Speicher-Paging-Problem ist. VS hat nur noch wenig Speicher und das Betriebssystem startet den Seitentausch, um Speicherplatz zu schaffen. VS verlangt jedoch mehr, als der Seitentausch leisten kann, sodass der Crawl langsamer wird. Mir fällt keine andere Erklärung ein.

VS ist definitiv kein RAD-Tool, oder?


Ich hatte dieses Problem auch mit VS2005 - definitiv Paging
Johnc

1

Verwendet Ihr Unternehmen Entrust zufällig für seine PKI / Verschlüsselungslösung? Es stellte sich heraus, dass wir für eine ziemlich große, in C # erstellte Website eine miserable Build-Leistung hatten, die bei einem Rebuild-All mehr als 7 Minuten dauerte.

Mein Computer ist ein i7-3770 mit 16 GB RAM und einer 512 GB SSD, daher sollte die Leistung nicht so schlecht sein. Ich bemerkte, dass meine Erstellungszeiten auf einem älteren sekundären Computer, der dieselbe Codebasis erstellt, wahnsinnig schneller waren. Also habe ich ProcMon auf beiden Computern gestartet, die Builds profiliert und die Ergebnisse verglichen.

Und siehe da, die langsam arbeitende Maschine hatte einen Unterschied - einen Verweis auf die Entrust.dll im Stacktrace. Mit diesen neu erfassten Informationen suchte ich weiter in StackOverflow und fand Folgendes : MSBUILD (VS2010) auf einigen Computern sehr langsam . Gemäß der akzeptierten Antwort liegt das Problem in der Tatsache, dass der Entrust-Handler die .NET-Zertifikatprüfungen anstelle des nativen Microsoft-Handlers verarbeitete. Es wird auch vorgeschlagen, dass Entrust v10 dieses in Entrust 9 vorherrschende Problem löst.

Ich habe es derzeit deinstalliert und meine Build-Zeiten sind auf 24 Sekunden gesunken . YYMV mit der Anzahl der Projekte, die Sie derzeit erstellen, und möglicherweise nicht direkt das Skalierungsproblem, nach dem Sie gefragt haben. Ich werde diese Antwort bearbeiten, wenn ich einen Fix bereitstellen kann, ohne die Software zu deinstallieren.


0

Es ist sicher, dass es ein Problem mit VS2008 gibt. Ich habe nur VS2008 installiert, um mein mit VS2005 erstelltes Projekt zu aktualisieren. Ich habe nur 2 Projekte in meiner Lösung. Es ist nicht groß. Kompilierung mit VS2005: 30 Sekunden Kompilierung mit VS2008: 5 Minuten


Es muss dort ein anderes Problem geben, 2 Projekte sollten auf einer anständigen Maschine
gut

0

Nette Vorschläge, die bisher geholfen haben (ohne zu sagen, dass es unten keine anderen netten Vorschläge gibt, wenn Sie Probleme haben, empfehle ich, dann zu lesen, was uns geholfen hat)

  • Neuer 3-GHz-Laptop - die Leistung der verlorenen Nutzung wirkt Wunder, wenn es um das Management geht
  • Deaktivieren Sie Anti Virus während des Kompilierens
  • 'Trennen' von VSS (eigentlich dem Netzwerk) während des Kompilierens - Ich kann uns veranlassen, die VS-VSS-Integration vollständig zu entfernen und bei der Verwendung der VSS-Benutzeroberfläche zu bleiben

Immer noch nicht durch eine Kompilierung schnupfen, aber jedes bisschen hilft.

Wir testen auch die Praxis, neue Anwendungsbereiche in neuen Lösungen zu erstellen, die neuesten DLLs nach Bedarf zu importieren und sie in die größere Lösung zu integrieren, wenn wir mit ihnen zufrieden sind.

Wir können sie auch für vorhandenen Code verwenden, indem wir temporäre Lösungen erstellen, die nur die Bereiche zusammenfassen, an denen wir arbeiten müssen, und sie nach der Wiedereingliederung des Codes wegwerfen. Wir müssen die Zeit abwägen, die für die Wiedereingliederung dieses Codes benötigt wird, gegen die Zeit, die wir gewinnen, wenn wir keine Rip Van Winkle-ähnlichen Erfahrungen mit der schnellen Neukompilierung während der Entwicklung haben.

Orion erwähnte in einem Kommentar, dass Generika auch ein Stück haben könnten. Aus meinen Tests geht hervor, dass es nur einen minimalen Leistungseinbruch gibt, der jedoch nicht hoch genug ist, um sicherzugehen, dass die Kompilierungszeiten aufgrund der Disc-Aktivität inkonsistent sein können. Aus zeitlichen Gründen enthielten meine Tests nicht so viele Generika oder Code, wie im Live-System angezeigt würden, sodass sich diese möglicherweise ansammeln. Ich würde es nicht vermeiden, Generika dort zu verwenden, wo sie verwendet werden sollen, nur um die Leistung bei der Kompilierung zu gewährleisten

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.