Again this performance enhancement (or technology I would say ) is targeting the application startup time more focused on the large desktop mammoth though! the new technology Microsoft introducing with .Net 4.5 is not going to be brand new for you if you are a C++ developer.
The PGO build process in C++
In C++ shipped with .Net 1.1 a multi-step compilation known as Profile Guided Optimization (PGO) as an optimization technique can be used by the C++ developer to enhance the startup time of the application. by running the application though some common scenarios (exercising your app) with data collection running in the background then used the result of that for optimized compilation of the code. you can read more about PGO here.
As a matter of fact Microsoft has been using this technology since .Net 2.0 to generate optimized ngen-ed assemblies (eating their own dog food) and now they are releasing this technology for you to take advantage of in your own managed applications.
Crash Course to .Net Compilation
In .Net when you compile your managed code it really gets interpreted into another language (IL) and is not compiled to binaries will be running on the production machine, this happen at the run time and referred to as Just-In-Time (JIT) Compilation. The alternative way to that is to pre-compile your code prior to execution at runtime using NGEN tool (shipped with .Net).
Generating these native images to the production processor usually speed up lunch time of the application especially large desktop apps that require a lot of JITting now there are not JIT compilation required at all.
Why you want to use NGen?
If it’s not obvious yet here are some good reasons:
- NGen typically improves the warm startup time of applications, and sometimes the cold startup time as well
- NGen also improves the overall memory usage of the system by allowing different processes that use the same assembly to share the corresponding NGen image among them
Exercise your Assemblies!
The Managed Profile Guided Optimization (MPGO) technology can improve the startup and working set (memory usage) of managed applications by optimizing the layout of precompiled native images.By organize the layout of your native image so most frequently called data are located together in a minimal number of disk pages in order to optimize each request for a disk page of image data to include a higher density of useful image data for the running program which in return will reduce the number of page requests from disk. if you think more about it, mostly it will be useful to machines with mechanical disks but if you have already moved to the Solid State Drive Nirvana the expected performance improvement will probably will be unnoticeable.
How it Works?
As I mentioned before it’s a very similar process to PGO from C++ compiler, where you exercise your assemblies, here are a simplified steps of the process:
- Compile and Build your large desktop application to generate the normal IL assemblies.
- Run MPGO tool on the IL assemblies built before.
- Now exercise a variety of representative user scenarios within your application.(not too little not too much you don’t want the tool be confused about how to organize the layout of your image).
- MPGO will store the profile created from your “training” with each IL assembly trained.
- Now when you use NGEN tool on the trained assemblies it will genreate an optimized native image.
How to use MPGO
you can find MPGO in the following directory:
C:\program files(x86)\microsoft visual studio 11.0\team tools\performance tools\mpgo.exe
- Run VS command as administrator and execute MPGO with the correct parameters
MPGO -scenario “c:\profiles\WinApp.exe” -OutDir “C:\profiles\optimized” -AssemblyList “c:\profiles\WinApp.exe”
- Exercise some most used scenarios on your application. then close the application
- The IL with profiles will be generated in the output dir
- Run Ngen on the IL+Profiles
- Run the optimized application.
MPGO is very cool innovative technology but the results of it depends highly on the human factor, what scenarios you will exercise? and how you’ll run it? the profile gets created so you might end up running it multiple times with different scenarios before your get the expected lunch time you’re looking for.
- Profile-Guided Optimization with Microsoft Visual C++ 2005
- MSDN: Ngen.exe (Native Image Generator)
- The Performance Benefits of NGen.
- Improving Launch Performance for Your Desktop Applications
Hope this Helps,