29 Stimmen

Warum ist aspnet_compiler.exe so langsam (und kann es schneller gemacht werden)?

Während unseres Build-Vorgangs führen wir aspnet_compiler.exe gegen unsere Websites aus, um sicherzustellen, dass alles Spät gebundene Zeug in ASP.NET/MVC tatsächlich kompiliert wird (ich weiß nichts über ASP.NET, aber mir wird versichert, dass dies notwendig ist, um zu verhindern, dass Fehler zur Laufzeit auftreten).

Unsere Websites sind ziemlich groß, mit ein paar hundert Seiten/Ansichten/Steuerungen usw., allerdings scheint die benötigte Zeit im Bereich von 10-15 Minuten übermäßig zu sein (zur Referenz: dies dauert länger als die komplette Lösung mit ca. 40 Projekten zu kompilieren, und wir kompilieren nur zwei Website-Projekte vor).

Ich bezweifle, dass es an der Hardware liegt, da ich auf dem neuesten Quad-Core-Intel-Chip mit 4GB RAM und einer WD Velociraptor 10.000rpm Festplatte arbeite. Und was seltsam ist, ist dass die EXE nicht viel CPU verwendet (1-5%) und auch nicht besonders viel I/O zu sein scheint.

Also... ist dies ein bekanntes Problem? Warum ist es so langsam? Und gibt es eine Möglichkeit, es zu beschleunigen?

Hinweis: Um ein paar Dinge zu klären, über die einige Leute geantwortet haben, ich rede nicht über die Kompilierung von Code innerhalb von Visual Studio. Wir verwenden bereits Webanwendungsprojekte, und die Geschwindigkeit der Kompilierung dieser ist nicht das Problem. Das Problem ist die Vorkompilierung der Website nachdem diese Projekte bereits kompiliert wurden (siehe diese MSDN-Seite für weitere Details) als Teil des Entwicklungs-Build-Skripts. Wir führen eine In-Place-Vorkompilierung durch, ohne die Dateien in ein Zielverzeichnis zu kopieren.

8voto

Vladimir Khvostov Punkte 146

Der Wechsel zum Roslyn-Compiler wird höchstwahrscheinlich die Vorabkompilierungszeit erheblich verbessern. Hier ist ein guter Artikel dazu: https://devblogs.microsoft.com/aspnet/enabling-the-net-compiler-platform-roslyn-in-asp-net-applications/.

Zusätzlich dazu stellen Sie sicher, dass die Stapelkompilierung aktiviert ist, indem Sie das Attribut "batch" im Element "compilation" auf "true" setzen.

6voto

JerKimball Punkte 16168

Einfach gesagt verwendet der aspnet_compiler effektiv ein "globales Compiler-Sperrverriegelung", wann immer es mit dem Vorcompilieren einer einzelnen aspx-Seite beginnt; es darf im Grunde genommen jede Seite nur nacheinander kompilieren.

Dafür gibt es Gründe (obwohl ich persönlich anderer Meinung bin) - hauptsächlich, um zirkuläre Verweise zu erkennen und zu verhindern, die eine Art Endlosschleife verursachen könnten, sowie sicherzustellen, dass alle Abhängigkeiten ordnungsgemäß erstellt werden, bevor die erforderliche Seite kompiliert wird, um viele "nasty CS issues" zu vermeiden.

Einmal habe ich angefangen, eine stark verzweigte Version von aspnet_compiler.exe zu schreiben, als ich das letzte Mal bei einem Webunternehmen gearbeitet habe, aber ich wurde mit "echter Arbeit" überlastet und habe sie nie beendet. Das größte Problem sind die ASPX-Seiten: Bei dem MVC/Razor-Stuff kann man die Hölle aufteilen, aber der ASPX-Parser/Kompilierungsmechanismus besteht aus etwa 20 Ebenen interner und privater Klassen/Methoden.

2voto

user38123 Punkte 669
  1. Der Compiler sollte für jede .aspx-Seite eine zweite Code-Behind-Datei generieren, prüfen
  2. Während der Kompilierung kopiert aspnet_compiler.exe ALLE Website-Dateien in das Ausgabeverzeichnis, einschließlich css, js und Bilder.

Sie erhalten bessere Kompilierungszeiten, wenn Sie anstelle des Website-Modells das Webanwendungsprojekt verwenden.

0voto

Will Dean Punkte 38365

Ich habe keine speziellen heißen Tipps für diesen Compiler, aber wenn ich dieses Problem habe, benutze ich ProcMon, um zu sehen, was der Prozess auf dem Rechner macht, und ich führe Wireshark aus, um sicherzustellen, dass er nicht ewig wartet, bis er auf einen lange vergessenen Rechner zugreift, der in einem Registrierungsschlüssel oder Umgebungsvariable referenziert ist.

-1voto

Alex from Jitbit Punkte 44084

Nur meine 2 Cent.

Einer der Dinge, die die Vorkompilierung von ASP.NET-Ansichten erheblich verlangsamen, ist die Befehlszeilenoption -fixednames für aspnet_compiler.exe. Verwenden Sie sie nicht, besonders wenn Sie Razor/MVC verwenden.

Beim Veröffentlichen der Webanwendung aus Visual Studio stellen Sie sicher, dass Sie "Nicht zusammenführen" auswählen und nicht "Separate Assembly erstellen", da dies den globalen Lock verursacht und die Dinge verlangsamt.

Bildbeschreibung hier eingeben

Weitere Informationen hier https://msdn.microsoft.com/en-us/library/hh475319(v=vs.110).aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X