2008-11-14 5 views
20

Pendant notre processus de construction, nous exécutons aspnet_compiler.exe par rapport à nos sites Web pour nous assurer que tout ce qui est lié à ASP.NET/MVC se construit réellement (je ne connais rien à ASP.NET mais je suis assuré que cela est nécessaire pour éviter les échecs runtime).Pourquoi aspnet_compiler.exe est-il si lent (et peut-il être rendu plus rapide)?

Nos sites sont assez grands, avec quelques centaines de pages/vues/contrôles/etc. cependant, le temps pris semble excessif dans la plage de 10 à 15 minutes (pour référence, cela prend plus de temps que la totalité de la solution avec environ 40 projets à compiler, et nous ne faisons que pré-compiler deux projets de site Web). Je doute que le matériel est le problème que je cours sur la dernière puce Intel de noyau de quadruple, avec 4GB RAM et un disque dur de WD Velociraptor 10,000rpm. Et une partie de ce qui est étrange, c'est que le EXE ne semble pas utiliser beaucoup de CPU (1-5%) et ne semble pas faire énormément d'E/S non plus.

Alors ... est-ce un problème connu? Pourquoi est-ce si lent? Et y a-t-il un moyen de l'accélérer?

Remarque: Pour clarifier un certain nombre de choses auxquelles les gens ont répondu, je ne parle pas de la compilation de code dans Visual Studio. Nous utilisons déjà des projets d'application Web, et la vitesse de compilation de ceux-ci n'est pas le problème. Le problème est la pré-compilation du site après ces projets ont déjà été compilés (see this MSDN page for more details) dans le cadre du script de développement dev. Nous effectuons une pré-compilation sur place, sans copier les fichiers dans un répertoire cible.

+11

Avez-vous pu obtenir le compilateur aspnet pour compiler un site plus rapidement? La réponse que vous avez acceptée n'a pas été très utile car elle disait d'utiliser un projet d'application web, ce que vous faisiez déjà – JeremyWeir

Répondre

2
  1. compilateur devrait générer deuxième fichier code-behind pour chaque page .aspx, check
  2. Lors de la compilation, aspnet_compiler.exe copie tous les fichiers du site Web pour le répertoire de sortie, y compris css, js et images.

Vous obtiendrez de meilleurs temps de compilation en utilisant Web application project au lieu du modèle de site Web.

+2

Quel est maintenant votre temps de pré-compilation avec cette solution? –

0

Je n'ai pas d'astuces spécifiques pour ce compilateur, mais quand j'ai ce genre de problème, je lance ProcMon pour voir ce que le processus fait sur la machine, et je lance Wireshark pour vérifier qu'il n'est pas t Dépassement des délais d'expiration de l'accès réseau à une machine oubliée depuis longtemps et référencée dans une clé de registre ou une variable d'environnement.

4

Simplement, le aspnet_compiler utilise ce qui est effectivement un "verrou de compilateur global" lorsqu'il commence à précompiler une page aspx individuelle; il est fondamentalement seulement autorisé à compiler chaque page séquentiellement. Il y a des raisons à cela (bien que je ne suis pas personnellement d'accord avec eux) - principalement, pour détecter et empêcher les références circulaires causant une boucle infinie de sortes, ainsi que s'assurer que toutes les dépendances sont correctement construites avant que la page compilés, ils évitent beaucoup de "problèmes de CS méchants".

J'ai déjà commencé à écrire une version massivement fourchue de aspnet_compiler.exe la dernière fois que je travaillais dans une société web, mais je me suis retrouvé avec un «vrai travail» et je ne l'ai jamais fini. Le plus gros problème est les pages ASPX: les trucs MVC/Razor vous pouvez paralléliser le HELL, mais le moteur d'analyse/compilation ASPX est à environ 20 niveaux de profondeur des classes/méthodes internes et privées.

7

La conversion au compilateur Roslyn améliorera très probablement le temps de précompilation. Voici un bon article à ce sujet: http://blogs.msdn.com/b/webdev/archive/2014/05/12/enabling-the-net-compiler-platform-roslyn-in-asp-net-applications.aspx.De plus, assurez-vous que la compilation par lots est activée en définissant l'attribut de lot sur true sur l'élément de compilation.

+1

Oui, c'est génial. Nous avons simplement installé le paquet 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform' sur notre projet et obtenu la compilation des vues presque deux fois plus vite. –

+0

@MariuszPawelski Je l'ai installé mais l'étape MVCBuildViews utilise encore aspnet_compiler.exe pour une raison quelconque. Existe-t-il un moyen de forcer le compilateur à utiliser Roslyn pour pré-compiler des vues? Core Compile et les autres étapes utilisent csc.exe qui est le nouveau compilateur Roslyn. – delloPiro

+0

@delloPiro Le paquet 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform' est un remplaçant direct pour les fournisseurs de boîte de réception et l'installation du paquet est tout ce que vous devriez faire pour les activer et aspnet_compiler.exe est _est simplement un wrapper autour de la fonction de compilation d'exécution et n'utilise pas msbuild en aucune façon. Il ne compilera que les parties de votre application qui auraient été compilées à l'exécution par ASP.NET_ Donc, si vous utilisez MVCBuildViews, il utilisera toujours aspnet_compiler.exe. C'est juste en utilisant roslyn en interne, donc c'est plus rapide. –

Questions connexes