2008-11-14 8 views
20

Durante nuestro proceso de compilación, ejecutamos aspnet_compiler.exe contra nuestros sitios web para asegurarnos de que todas las cosas atrasadas en ASP.NET/MVC realmente se crean (no sé nada de ASP.NET, pero estoy seguro de que esto es necesario para evitar encontrar las fallas en tiempo de ejecución).¿Por qué aspnet_compiler.exe es tan lento (y puede hacerse más rápido)?

Nuestros sitios son bastante grandes, con algunos cientos de páginas/vistas/controles/etc. sin embargo, el tiempo empleado parece excesivo en el rango de 10-15 minutos (como referencia, esto es más largo de lo que se necesita para compilar toda la solución con aproximadamente 40 proyectos, y solo estamos precompilando dos proyectos de sitio web).

Dudo que el hardware sea el problema, ya que estoy utilizando el último chip Intel de cuatro núcleos, con 4 GB de RAM y un disco duro WD Velociraptor de 10.000 rpm. Y parte de lo extraño es que el EXE no parece estar usando mucha CPU (1-5%) y tampoco parece estar haciendo demasiadas operaciones de E/S.

Entonces ... ¿es este un problema conocido? ¿Por qué es tan lento? ¿Y hay alguna forma de acelerarlo?

Nota: Para aclarar un par de cosas que las personas han respondido, no estoy hablando de la compilación de código dentro de Visual Studio. Ya estamos usando proyectos de aplicaciones web, y la velocidad de compilación de esos no es el problema. El problema es la precompilación del sitio después de estos proyectos ya se han compilado (see this MSDN page for more details) como parte del script de compilación dev. Estamos realizando precompilación in situ, no copiando los archivos en un directorio de destino.

+11

¿Pudo conseguir el aspnet_compiler para compilar un sitio más rápido? La respuesta que usted aceptó no fue muy útil ya que decía usar un proyecto de aplicación web, que ya estaba haciendo – JeremyWeir

Respuesta

2
  1. compilador debe generar segundo archivo de código subyacente para cada página .aspx, check
  2. Durante la compilación, aspnet_compiler.exe copiará todos los archivos del sitio web para el directorio de salida, incluyendo CSS, JS y las imágenes.

Obtendrá mejores tiempos de compilación utilizando Web application project en lugar del modelo del sitio web.

+2

¿Cuál es ahora el tiempo de precompilación con esta solución? –

0

No tengo ningún consejo específico para este compilador, pero cuando tengo este tipo de problema, ejecuto ProcMon para ver lo que está haciendo el proceso en la máquina, y ejecuto Wireshark para comprobar que no es así. El gasto de tiempo agota el tiempo de acceso de red a una máquina largamente olvidada a la que se hace referencia en alguna clave de registro o variable de entorno.

4

Simplemente, el aspnet_compiler usa lo que es efectivamente un "bloqueo de compilador global" cada vez que comienza a precompilar cualquier página aspx individual; básicamente solo se permite compilar cada página secuencialmente.

Existen razones para esto (aunque personalmente no estoy de acuerdo con ellas), principalmente para detectar y evitar referencias circulares que causan un bucle infinito, así como para garantizar que todas las dependencias se construyan correctamente antes de que se requiera la página compilados, evitan muchos "desagradables problemas de CS".

Una vez comencé a escribir una versión de bifurcación masiva de aspnet_compiler.exe última vez que trabajé en una empresa web, pero me até con "trabajo real" y nunca lo terminé. El mayor problema son las páginas ASPX: las cosas MVC/Razor en las que puedes paralelizar el HELL, pero el motor ASPX parse/compile tiene aproximadamente 20 niveles de clases/métodos internos y privados.

7

Cambiar al compilador de Roslyn probablemente mejorará significativamente el tiempo de precompilación. Aquí hay un buen artículo al respecto: http://blogs.msdn.com/b/webdev/archive/2014/05/12/enabling-the-net-compiler-platform-roslyn-in-asp-net-applications.aspx.

Además de esto, asegúrese de que la compilación de lotes esté habilitada estableciendo el atributo de lote en verdadero en el elemento de compilación.

+1

Sí, esto es genial. Simplemente instalamos el paquete 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform' en nuestro proyecto y obtuvimos la compilación de vistas casi dos veces más rápido. –

+0

@MariuszPawelski Tengo este instalado, pero el paso MVCBuildViews todavía usa aspnet_compiler.exe por algún motivo. ¿Hay alguna manera de obligar al compilador a utilizar Roslyn para compilar previamente las vistas? Core Compile y los demás pasos utilizan csc.exe, que es el nuevo compilador de Roslyn. – delloPiro

+0

@delloPiro El paquete 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform' es _un reemplazo directo para los proveedores integrados y la instalación del paquete es todo lo que debe hacer para habilitarlos_ y aspnet_compiler.exe es _es simplemente un contenedor alrededor de la característica de compilación de tiempo de ejecución y no usa msbuild de ninguna manera. Solo compilará las porciones de su aplicación que se habrían compilado en tiempo de ejecución con ASP.NET_ . Por lo tanto, si usa MVCBuildViews, seguirá usando aspnet_compiler.exe. Simplemente usa roslyn internamente, así que es más rápido. –

Cuestiones relacionadas