Mejora del rendimiento de inicio con NGen
Nota:
Solo EF6 y versiones posteriores: las características, las API, etc. que se tratan en esta página se han incluido a partir de Entity Framework 6. Si usa una versión anterior, no se aplica parte o la totalidad de la información.
.NET Framework admite la generación de imágenes nativas para aplicaciones y bibliotecas administradas como una manera de ayudar a las aplicaciones a iniciarse más rápido y, en algunos casos, a usar menos memoria. Las imágenes nativas se crean mediante la traducción de ensamblados de código administrado en archivos que contienen instrucciones de máquina nativas antes de que se ejecute la aplicación, liberando al compilador JIT (Just-In-Time) de .NET de tener que generar las instrucciones nativas en tiempo de ejecución de la aplicación.
Antes de la versión 6, las bibliotecas principales del entorno de ejecución de EF formaban parte de .NET Framework y las imágenes nativas se generaron automáticamente para ellas. A partir de la versión 6, todo el entorno de ejecución de EF se ha combinado en el paquete NuGet de EntityFramework. Las imágenes nativas ahora deben generarse mediante la herramienta de línea de comandos NGen.exe para obtener resultados similares.
Las observaciones empíricas muestran que las imágenes nativas de los ensamblados en tiempo de ejecución de EF pueden recortar entre 1 y 3 segundos de tiempo de inicio de aplicaciones.
Cómo usar NGen.exe
La función más básica de la herramienta NGen.exe es “instalar” (es decir, crear y conservar en disco) imágenes nativas para un ensamblado y todas sus dependencias directas. Aquí se muestra cómo lograrlo:
Abra una ventana de símbolo del sistema como administrador.
Cambie el directorio de trabajo actual a la ubicación de los ensamblados para los que desee generar imágenes nativas:
cd <*Assemblies location*>
Según el sistema operativo y la configuración de la aplicación, es posible que tenga que generar imágenes nativas para la arquitectura de 32 bits, la arquitectura de 64 bits o para ambas.
Para la ejecución de 32 bits:
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install <Assembly name>
Para la ejecución de 64 bits:
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install <Assembly name>
Sugerencia
La generación de imágenes nativas para la arquitectura incorrecta es un error muy común. Si tuviera dudas, simplemente podría generar imágenes nativas para todas las arquitecturas que se apliquen al sistema operativo instalado en la máquina.
NGen.exe también admite otras funciones, como desinstalar y mostrar las imágenes nativas instaladas, poner en cola la generación de varias imágenes, etc. Para obtener más información sobre el uso, lea la documentación de NGen.exe.
Cuándo usar NGen.exe
Cuando se trata de decidir para qué ensamblados generar imágenes nativas en una aplicación basada en EF versión 6 o posterior, debería tener en cuenta las siguientes opciones:
- Ensamblado principal del entorno de ejecución de EF, EntityFramework.dll: una aplicación típica basada en EF ejecuta una cantidad significativa de código de este ensamblado al inicio o en su primer acceso a la base de datos. Por lo tanto, la creación de imágenes nativas de este ensamblado generará las mayores ganancias en el rendimiento de inicio.
- Cualquier ensamblado de proveedor de EF usado por la aplicación: el tiempo de inicio también podría beneficiarse ligeramente de la generación de imágenes nativas de estas. Por ejemplo, si la aplicación usara el proveedor de EF para SQL Server, querrá generar una imagen nativa para EntityFramework.SqlServer.dll.
- Los ensamblados de la aplicación y otras dependencias: la documentación de NGen.exe abarca criterios generales para la elección de para qué ensamblados generar imágenes nativas y el impacto de las imágenes nativas en la seguridad, opciones avanzadas como el enlace” duro, escenarios como “el uso de imágenes nativas en escenarios de depuración y generación de perfiles, etc.
Sugerencia
Asegúrese de medir cuidadosamente el impacto del uso de imágenes nativas, tanto en el rendimiento de inicio como en el rendimiento general de la aplicación, y compárelos con los requisitos reales. Aunque las imágenes nativas generalmente ayudarán a mejorar el rendimiento de inicio y, en algunos casos, reducirán el uso de memoria, no todos los escenarios se beneficiarán por igual. Por ejemplo, en la ejecución de estado estable (es decir, una vez que se hayan invocado todos los métodos que usa la aplicación al menos una vez), el código generado por el compilador JIT podría realmente producir un rendimiento ligeramente mejor que el de las imágenes nativas.
Uso de NGen.exe en una máquina de desarrollo
Durante el desarrollo, el compilador JIT de .NET ofrecerá el mejor equilibrio general para aquel código que se cambie con frecuencia. La generación de imágenes nativas para dependencias compiladas, como los ensamblados en tiempo de ejecución de EF, podría ayudar a acelerar el desarrollo y las pruebas recortando unos segundos al principio de cada ejecución.
Un buen lugar para encontrar los ensamblados en tiempo de ejecución de EF es la ubicación del paquete NuGet para la solución. Por ejemplo, para una aplicación que use EF 6.0.2 con SQL Server y que tenga como destino .NET 4.5 o superior, podría escribir lo siguiente en una ventana del símbolo del sistema (recuerde abrirla como administrador):
cd <Solution directory>\packages\EntityFramework.6.0.2\lib\net45
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install EntityFramework.SqlServer.dll
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install EntityFramework.SqlServer.dll
Nota:
Esto aprovecha el hecho de que la instalación de las imágenes nativas para el proveedor de EF para SQL Server también instalará de forma predeterminada las imágenes nativas para el ensamblado principal del entorno de ejecución de EF. Esto funciona porque NGen.exe puede detectar que EntityFramework.dll es una dependencia directa del ensamblado de EntityFramework.SqlServer.dll ubicado en el mismo directorio.
Creación de imágenes nativas durante la instalación
WiX Toolkit admite la puesta en cola de la generación de imágenes nativas para ensamblados administrados durante la instalación, tal y como se explica en esta guía paso a paso. Otra alternativa consiste en crear una tarea de instalación personalizada que ejecute el comando NGen.exe.
Comprobación de que se usen imágenes nativas para EF
Es posible comprobar que una aplicación específica esté usando un ensamblado nativo buscando ensamblados cargados que tengan la extensión “.ni.dll” o “.ni.exe”. Por ejemplo, una imagen nativa para el ensamblado principal del entorno de ejecución de EF se denominará EntityFramework.ni.dll. Una manera fácil de inspeccionar los ensamblados de .NET cargados de un proceso consiste en usar el Explorador de procesos.
Otras cosas que se deben tener en cuenta
La creación de una imagen nativa de un ensamblado no debería confundirse con el registro del ensamblado en la GAC (caché global de ensamblados). NGen.exe permite la creación de imágenes de ensamblados que no estén en la GAC y, de hecho, varias aplicaciones que usen una versión específica de EF podrían compartir la misma imagen nativa. Aunque Windows 8 puede crear automáticamente imágenes nativas para ensamblados colocados en la GAC, el entorno de ejecución de EF está optimizado para implementarse junto con la aplicación y no se recomienda registrarlo en la GAC, ya que esto tendría un impacto negativo en la resolución de ensamblados y en el mantenimiento de aplicaciones, entre otros aspectos.