C# ProfileOptimization Example

ProfileOptimization helps programs start up faster. We call the SetProfileRoot and StartProfile methods at startup. After the program exists, a profile file is created. At next startup, this profile is used to compile methods.

Note: ProfileOptimization requires a computer with at least two logical processor cores.

Note 2: If a single-core computer runs a ProfileOptimization program, the methods have no effect. They are silently ignored.

Based on:

.NET 4.5

Example. This program reveals the syntax of ProfileOptimization. Please add the System.Runtime with a using-directive. The SetProfileRoot method is called to indicate the folder where profiles are stored.

And: The StartProfile method specifies both the name of the profile file, and that profiling should begin.

Caution: To end profiling, the program must be exited normally—it cannot just be terminated.

C# program that uses ProfileOptimization

using System.Runtime;

class Program
    static void Main()
	// Profiles directory must exist.
	// ... "profile" is created.

Discussion. I did not design the ProfileOptimization feature, so I can't describe its implementation in depth. But the general concept is that the profile contains a list of the methods that are required by the program on execution.

Then: When a profiled program starts up, the .NET Framework reads in the profile. It then compiles those methods on a separate thread.

And: This relieves the pause due to JIT-compilation for those needed methods. This reduces startup time.


Stop profiling. One problem I ran into when using ProfileOptimization is that a program must be closed normally for the profile to be written. If you just close a console window, the profile is not written.

Performance. A performance optimization that does not optimize performance is worthless. For small or fast-running programs, ProfileOptimization does not help much. But on certain programs, it is worthwhile.

Actual results. I have a program that requires about 1 second to run. It has about 30,000 lines of C# code. Most of its runtime is disk access and reads. But I enabled ProfileOptimization for a significant benefit.

Results: The program runs approximately 10% faster with a profile than without a profile.

ProfileOptimization results

Before: 1074 ms
	1078 ms
	1076 ms
After:   964 ms
	 962 ms
	 961 ms

Summary. Profiling a program improves startup speed. It works only on computers with multiple processor cores. The feature requires a call to ProfileOptimization.SetProfileRoot and StartProfile. We saw real performance results.