The Performance profiler allows you to monitor the execution of 32-bit and 64-bit native, managed (.NET), Java, Silverlight applications and script code and to find potential performance bottlenecks.
The following sections provide detailed information about the Performance profiler.
The Performance profiler is your primary tool for investigating the performance of your 32-bit and 64-bit applications. It monitors the application execution and gathers considerable information about each application function, for instance, the number of function calls, the hierarchy of function calls, time spent executing the function, etc. It also provides information on pure .NET characteristics, such as time spent on JIT compilation and garbage collection (more below).
The Performance profiler analyzes the application code at two levels of detail: routine and line. To profile the lines of a routine, add this routine to a line-level area. Also, to profile routines at line level, you have to compile the application with debug information (this concerns both unmanaged, .NET and Java modules). See How AQTime Profilers Use Metadata and Debug Information.
The profiler also supports triggers and actions. They allow you to turn the profiling on or off exactly when it is needed during the application run. For more information, see Using Triggers and Using Actions.
The results of the Performance profiler runs are displayed in the Report, Details, Call Graph, Call Tree and Editor panels. For detailed description of profiling results, review the Performance Profiler Results topic.
Measuring Different Performance Characteristics
According to its name, the Performance profiler serves for analyzing the application’s performance. This profiler monitors all function calls in your application and measures different characteristics of the application. For instance:
- The time spent for executing a routine,
- The number of routine calls,
- The hierarchy of function calls,
- The number of CPU cache updates that occurred during the routine execution,
- And others.
What characteristic the profiler measures depends on the Active Counter profiler option (which you can change in the Performance Profiler Settings dialog that appears once this profiler starts). The following counters are available in the current AQTime version:
|Some counters may be unavailable. For more information, see below.|
All counters work for managed and unmanaged code and support 32-bit and 64-bit applications. For a complete description of counters, see Counters Overview.
Why do you need several counters? Because they help you not only find poorly performing functions, but determine why these functions are performing poorly during the profiler run. Suppose, you analyzed your application with the Elapsed Time counter and found that the
FuncA routine runs too slow. This bottleneck can occur for several reasons:
FuncAwas called too many times;
FuncAworked fast itself, but it called a slow child routine;
FuncAcalled a routine from a system library or a .NET assembly that, in turn, took to much time to execute;
FuncAworks with data in memory, the algorithm of its functioning might not be optimal so the CPU had to update its cache too many times during the function execution or too many hard page faults occurred.
To determine the exact cause of poor application performance, you can profile
FuncA and other slow routines with another counter and try to eliminate the bottleneck cause, if possible. For more information, see Searching for Bottleneck Reasons Using the Performance Profiler.
Measuring .NET-Specific Information
No matter what counter you use, the Performance profiler lets you get static and runtime information concerning Just-In-Time (JIT) compilation of all methods in your .NET application. This includes, for example, the time spent for “JITting” (JIT compilation) or the number of CPU cache updates that occurred during JITting. The profiler works by logging special notification events generated by the JITting and of each method. One use of the profiler is to find the compiling-time (JITting-time) cost for your methods. You can then work to simplify those that waste the most time.
The profiler also collects such .NET-specific information as the garbage-collection time for each profiled routine. The garbage collector pauses the .NET application and the time spent for the garbage collection is included in the function execution time. The Performance profiler lets you determine the portion of garbage collection time in the total function execution time. For more information about the JIT compilation and garbage collection times, see Pseudo-Routines in Profiling Results.
- Results displayed in AQTime panels depend on the counter that was in use during the profiling run. For instance, if you profiled your application with the Elapsed Time, User Time or User+Kernel Time counters, AQTime panels will hold timing results. In the other topics of this section, we will mention results of the time counters only. Results of the other counters can be interpreted similar to the timing results and you can work with them in the same manner as you work with the timing results.
- If you are measuring time characteristics, you can specify a unit of time measurement for “time” columns (like Seconds or Machine Cycles).
Important: Some counters may be unavailable. This depends on the CPU model and the software used. For instance, some counters do not work on Pentium II or do not support the processor’s SpeedStep technology, while others do not function under virtual machines. Also, if you run AQTime on a 64-bit operating system, some counters are available only if the OS is working in debug mode. For complete information on known counter restrictions, see Counters Overview.
Important: If you have Windows DDK installed, using some counters may cause the operating system to stop unexpectedly and display the error description on a blue screen. For more information on this problem and on how to solve it, see Counters Overview.
Important: If you use a computer that has several processors or a multiple-core processor (for example, dual-core CPU) and has Windows XP Service Pack 2, then you must install the Windows update #896256 in order for the profiler to be able to time your application correctly. The update is available on Microsoft’s web site:
If you are going to measure the performance of a large application, it is recommended that you first profile it at routine level and find the most problematic routines in the application. For this purpose, create a routine-level profiling area, add all of your modules to it and profile it with the Performance profiler. Since the information on lines is not collected, AQTime requires less memory and resources than it does when a line-level area is used.
As an alternative for unmanaged applications, you can first profile the application with the Sampling profiler. The Sampling profiler polls the application at certain time intervals to determine how long it takes the application to execute each routine. Data collected by the Sampling profiler is less precise and detailed than data collected by the Performance profiler, but the Sampling profiler works much faster.
Once you find the most problematic routines, you can profile these routines with the Performance profiler at line level. AQTime will collect more detailed profiling results only for these routines.
Performance Profiler Results
Pseudo-Routines in Profiling Results
Search for Bottleneck Reasons
Performance Profiler Options
Supported Processor Models