.net clr jit ngen

.net - JIT vs NGen: ¿cuál es la diferencia?



clr (5)

Entonces, cuando el tiempo de ejecución CLR carga un ensamblado .NET, lo compila en el código nativo de la máquina. Este proceso se llama JITing. NGen es también el proceso de compilación del ensamblado .NET en el código nativo. No entiendo cuál es la diferencia entre dos?


Desde MSDN ...

Native Image Generator (Ngen.exe) es una herramienta que mejora el rendimiento de las aplicaciones administradas. Ngen.exe crea imágenes nativas, que son archivos que contienen código máquina compilado específico del procesador, y las instala en la caché de imágenes nativas en la computadora local. El tiempo de ejecución puede usar imágenes nativas del caché en lugar de usar el compilador Just-In-Time (JIT) para compilar el ensamblaje original.

http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=VS.100).aspx

Básicamente, NGen le permite pre-JIT y almacenar en caché el ensamblaje en la máquina local. Esto permite un arranque más rápido y, a veces, la ejecución.


JIT solo se hace por método; no JIT todo ... Sólo los bits que necesita. Por supuesto, esto tiene un impacto pequeño pero medible la primera vez en un método (más genéricos, etc.). NGEN hace esto por adelantado, pero debe hacerse en la misma plataforma / arquitectura, etc., esencialmente esa máquina . Esto también significa agregarlo al GAC, etc., que puede necesitar un mayor acceso.

En muchos casos, JIT está bien, especialmente si la aplicación está abierta durante mucho tiempo (servidores web, por ejemplo).


La diferencia es cuando ocurren. La compilación de JIT ocurre mientras tu programa se está ejecutando. NGen se realiza normalmente en el momento de la instalación de su programa y ocurre antes de que se ejecute su programa. Uno de los objetivos de NGen es eliminar la penalización JIT del inicio de la aplicación.


Muchos detalles quedan aquí, pero:

Jit no es exactamente eso ... Jit es Just-In-Time, lo que significa que no se compila en el código nativo hasta que el código, como un método, se invoca realmente. Solo hay talones hasta entonces. Esto permanecerá en caché para que las llamadas posteriores al método no vuelvan a generar el código nativo.

NGen hace toda la asamblea a la vez. NGen lo hace todo a la vez para que no se requiera Jitting.


Una diferencia muy importante que aún no se ha mencionado es que las imágenes en caché nativas tienen ''páginas de códigos compartidos'', lo que hace una gran diferencia en la huella de memoria de las aplicaciones que se ejecutan en Servicios de Terminal Server o Citrix.

Lo más importante que hay que entender sobre NGEN es que, mientras compila tu código, también marca las páginas de códigos como compartibles, de forma que múltiples instancias de tu aplicación pueden compartir partes del espacio de memoria utilizado por la primera instancia. Y eso es realmente útil si está ejecutando bajo Servicios de Terminal Server.

http://blogs.msdn.com/b/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx .

Esto tiene implicaciones muy importantes para las aplicaciones que utilizan múltiples usuarios en una sola máquina, ya que comparten memoria entre los procesos. Esto puede provocar problemas de gestión de recursos y comportamiento muy extraños y difíciles de reproducir si las memorias caché de imágenes no se mantienen correctamente.