Originally Posted by MSDN
Determining When to Use Native Images
Native images can provide performance improvements in two areas: improved memory use and reduced startup time.
Note
Performance of native images depends on a number of factors that make analysis difficult, such as code and data access patterns, how many calls are made across module boundaries, and how many dependencies have already been loaded by other applications. The only way to determine whether native images benefit your application is by careful performance measurements in your key deployment scenarios.
Improved Memory Use
Native images can significantly improve memory use when code is shared between processes. Native images are Windows PE files, so a single copy of a .dll file can be shared by multiple processes; by contrast, native code produced by the JIT compiler is stored in private memory and cannot be shared.
Applications that are run under terminal services can also benefit from shared code pages.
In addition, not loading the JIT compiler saves a fixed amount of memory for each application instance.
Faster Application Startup
Precompiling assemblies with Ngen.exe can improve the startup time for some applications. In general, gains can be made when applications share component assemblies because after the first application has been started the shared components are already loaded for subsequent applications. Cold startup, in which all the 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 predominates.
Hard binding can affect startup time, because all images that are hard bound to the main application assembly must be loaded at the same time.
Note
If you have shared components that are strong-named, place them in the global assembly cache. The loader performs extra validation on strong-named assemblies that are not in the global assembly cache, effectively eliminating any improvement in startup time gained by using native images.