The Native Image Generator utility (Ngen.exe) allows you to run the JIT compiler on your assembly's MSIL and generate native machine code which is cached to disk. After the image is created .NET runtime will use the image to run the code rather than from the hard disk. Running Ngen.exe on an assembly potentially allows the assembly to load and execute faster, because it restores code and data structures from the native image cache rather than generating them dynamically.
Below are some points to be remembered for Native Image Generator:-
• Native images load faster than MSIL because JIT compilation and type-safety
verifications is eliminated.
• If you are sharing code between process Ngen.exe improves the performance significantly. As Native image generated Windows PE file so a single DLL file can be shared across applications. By contrast JIT produced code are private to an assembly and cannot be shared.
• Native images enable code sharing between processes.
• Native images require more storage space and more time to generate.
• Startup time performance improves lot. We can get considerable gains when
applications share component assemblies because after the first application has
been started the shared components are already loaded for subsequent
applications. If assemblies in an application must be loaded from the hard disk,
does not benefit as much from native images because the hard disk access time
shadows everything.
• Assemblies in GAC do not benefit from Native image generator as the loader
performs extra validation on the strong named assemblies thus shadowing the
benefits of Native Image Generator.
• If any of the assemblies change then Native image should also be updated.
• You should have administrative privilege for running Ngen.exe.
• While this can fasten, your application startup times as the code is
statically compiled but it can be somewhat slower than the code generated
dynamically by the JIT compiler. Therefore, you need to compare how the whole
application performance with Ngen.exe and with out it.
To run Ngen.exe, use the following command line.
This will synchronously precompile the specified assembly and all of its dependencies. The generated native images are stored in the native image cache.
In .NET Framework 2.0 there is a service (.NET Runtime Optimization Service)
which can precompile managed assemblies in the background. You can schedule your
assemblies to be precompiled asynchronously by queuing them up with the NGEN
Service. Use the following command line.
Assemblies, which are critical to your application’s start up time, should be precompiled either synchronously or asynchronously with priority 1. Priority 1 and 2 assemblies are precompiled aggressively while Priority 3 assemblies are only precompiled during machine idle-time. Synchronously precompiling your critical assemblies guarantees that the native images will be available prior to the first time your end user launches the application but increases the time taken to run your application's set up program.
You can uninstall an assembly and its dependencies (if no other assemblies are dependent on them) from the native image cache by running the following command.
Native images created using Ngen.exe cannot be deployed; instead, they need to be created on the end user's machine. These commands therefore need to be issued as part of the application's setup program. Visual Studio .NET can be used to implement this behavior by defining custom actions in a Microsoft Installer (MSI) package.
Note:- One of the things the interviewer will expect to be answered is what
scenario will use a Native Image generator. Best is to say that we first need to
test the application performance with Native Image and with out it and then make
a decision. If we see that we have considerable performance difference we can
then use native image generator.
Related to interview, view the following video on mock of .NET interview questions
Get more tutorials for Dotnet interview questions and answers
Regards,
Also view author’s blog for Most asked Dotnet interview questions
Below are some points to be remembered for Native Image Generator:-
• Native images load faster than MSIL because JIT compilation and type-safety
verifications is eliminated.
• If you are sharing code between process Ngen.exe improves the performance significantly. As Native image generated Windows PE file so a single DLL file can be shared across applications. By contrast JIT produced code are private to an assembly and cannot be shared.
• Native images enable code sharing between processes.
• Native images require more storage space and more time to generate.
• Startup time performance improves lot. We can get considerable gains when
applications share component assemblies because after the first application has
been started the shared components are already loaded for subsequent
applications. If assemblies in an application must be loaded from the hard disk,
does not benefit as much from native images because the hard disk access time
shadows everything.
• Assemblies in GAC do not benefit from Native image generator as the loader
performs extra validation on the strong named assemblies thus shadowing the
benefits of Native Image Generator.
• If any of the assemblies change then Native image should also be updated.
• You should have administrative privilege for running Ngen.exe.
• While this can fasten, your application startup times as the code is
statically compiled but it can be somewhat slower than the code generated
dynamically by the JIT compiler. Therefore, you need to compare how the whole
application performance with Ngen.exe and with out it.
To run Ngen.exe, use the following command line.
ngen.exe install <assemblyname>
This will synchronously precompile the specified assembly and all of its dependencies. The generated native images are stored in the native image cache.
In .NET Framework 2.0 there is a service (.NET Runtime Optimization Service)
which can precompile managed assemblies in the background. You can schedule your
assemblies to be precompiled asynchronously by queuing them up with the NGEN
Service. Use the following command line.
Ngen.exe install <assemblyname> /queue :<priority>
Assemblies, which are critical to your application’s start up time, should be precompiled either synchronously or asynchronously with priority 1. Priority 1 and 2 assemblies are precompiled aggressively while Priority 3 assemblies are only precompiled during machine idle-time. Synchronously precompiling your critical assemblies guarantees that the native images will be available prior to the first time your end user launches the application but increases the time taken to run your application's set up program.
You can uninstall an assembly and its dependencies (if no other assemblies are dependent on them) from the native image cache by running the following command.
ngen.exe uninstall <assemblyname>
Native images created using Ngen.exe cannot be deployed; instead, they need to be created on the end user's machine. These commands therefore need to be issued as part of the application's setup program. Visual Studio .NET can be used to implement this behavior by defining custom actions in a Microsoft Installer (MSI) package.
Note:- One of the things the interviewer will expect to be answered is what
scenario will use a Native Image generator. Best is to say that we first need to
test the application performance with Native Image and with out it and then make
a decision. If we see that we have considerable performance difference we can
then use native image generator.
Related to interview, view the following video on mock of .NET interview questions
Get more tutorials for Dotnet interview questions and answers
Regards,
Also view author’s blog for Most asked Dotnet interview questions
No comments:
Post a Comment