asp.net - route - ¿Por qué aspnet_compiler.exe es tan lento(y puede hacerse más rápido)?
select asp-for asp-items (4)
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 verificar que no esté pasando el tiempo de las edades -algún acceso de red a una máquina largamente olvidada a la que se hace referencia en alguna clave de registro o variable de entorno.
Durante nuestro proceso de compilación, ejecutamos aspnet_compiler.exe
contra nuestros sitios web para asegurarnos de que todo lo que se enlaza tarde en ASP.NET/MVC realmente se compila (no sé nada de ASP.NET, pero estoy seguro de que esto es necesario para evitar encontrar fallas en tiempo de ejecución).
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 usando 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 ... ¿este es un problema conocido? ¿Por qué es tan lento? ¿Y hay alguna forma de acelerarlo?
Nota: Para aclarar un par de cosas que la gente ha 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 que estos proyectos ya se hayan compilado ( consulte esta página de MSDN para obtener más detalles ) como parte del script de compilación dev. Estamos realizando precompilación in situ, no copiando los archivos en un directorio de destino.
- El compilador debe generar el segundo archivo de código subyacente para cada página .aspx, verificar
- Durante la compilación, aspnet_compiler.exe copiará TODOS los archivos del sitio web en el directorio de salida, incluidos css, js e imágenes.
Obtendrá mejores tiempos de compilación utilizando el proyecto de aplicación web en lugar del modelo de sitio web.
Simplemente, aspnet_compiler
usa lo que efectivamente es un "bloqueo de compilación global" cada vez que comienza a compilar previamente cualquier página aspx individual; básicamente solo se permite compilar cada página secuencialmente.
Hay razones para esto (aunque personalmente no estoy de acuerdo con ellas): principalmente, para detectar y evitar referencias circulares que causan un bucle infinito, además de garantizar que todas las dependencias se construyan correctamente antes de compilar la página requerida, evitan una gran cantidad de "desagradables problemas de CS".
Una vez comencé a escribir una versión de aspnet_compiler.exe
masiva de aspnet_compiler.exe
última vez que trabajé en una empresa web, pero me aspnet_compiler.exe
con "trabajo real" y nunca lo terminé. El mayor problema son las páginas ASPX: las cosas MVC / Razor en las que se puede paralelizar el INFIERNO, pero el motor ASPX parse / compile tiene unos 20 niveles de clases / métodos internos y privados.
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.