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.
quelle
Antworten:
Das Chromium.org-Team listete verschiedene Optionen zur Beschleunigung des Builds auf (zu diesem Zeitpunkt etwa in der Mitte der Seite):
quelle
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 references
aufDLL references
und entlädt die unerwünschten Projekte (und eine Option , um sie natürlich zurück zu wechseln).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.
quelle
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.
quelle
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.
quelle
Schalten Sie Ihr Antivirenprogramm aus. Es verlängert die Kompilierungszeit um Alter.
quelle
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.
quelle
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.
quelle
Wenn dies C oder C ++ ist und Sie keine vorkompilierten Header verwenden, sollten Sie dies tun.
quelle
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.
quelle
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).
quelle
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.
quelle
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:
quelle
Einige Analysewerkzeuge:
tools-> options-> VC ++ - Projekteinstellungen -> Build Timing = Ja gibt die Build-Zeit für jedes vcproj an.
Fügen Sie
/Bt
der Compiler-Befehlszeile einen Schalter hinzu, um zu sehen, wie viel jede CPP-Datei benötigt hatVerwenden Sie
/showIncludes
diese 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.
quelle
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.
quelle
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.
quelle
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.
quelle
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
quelle
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.
quelle
Deaktivieren Sie die Dateisystemindizierung für Ihre Quellverzeichnisse (insbesondere die obj-Verzeichnisse, wenn Ihre Quelle durchsuchbar sein soll).
quelle
Wenn es sich um eine Web-App handelt, kann es je nach Szenario hilfreich sein, den Batch-Build auf true zu setzen.
Eine Übersicht finden Sie hier: http://weblogs.asp.net/bradleyb/archive/2005/12/06/432441.aspx
quelle
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.
quelle
Eine billigere Alternative zu Xoreax IB ist die Verwendung von Uber-File-Builds. Es ist im Grunde eine .cpp-Datei, die hat
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:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.)
quelle
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?
quelle
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.
quelle
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
quelle
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)
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
quelle