Profilers use a wide variety of techniques to collect data, including hardware interrupts, code instrumentation, instruction set simulation, operating system hooks, and performance counters.
Program analysis tools are extremely important for understanding program behavior. Computer architects need such tools to evaluate how well programs will perform on new architectures. Software writers need tools to analyze their programs and identify critical sections of code. Compiler writers often use such tools to find out how well their instruction scheduling or branch prediction algorithm is performing...— ATOM, PLDI
Program analysis tools are extremely important for understanding program behavior. Computer architects need such tools to evaluate how well programs will perform on new architectures. Software writers need tools to analyze their programs and identify critical sections of code. Compiler writers often use such tools to find out how well their instruction scheduling or branch prediction algorithm is performing...
The output of a profiler may be:
A profiler can be applied to an individual method or at the scale of a module or program, to identify performance bottlenecks by making long-running code obvious.1 A profiler can be used to understand code from a timing point of view, with the objective of optimizing it to handle various runtime conditions2 or various loads.3 Profiling results can be ingested by a compiler that provides profile-guided optimization.4 Profiling results can be used to guide the design and optimization of an individual algorithm; the Krauss matching wildcards algorithm is an example.5 Profilers are built into some application performance management systems that aggregate profiling data to provide insight into transaction workloads in distributed applications.6
Performance-analysis tools existed on IBM/360 and IBM/370 platforms from the early 1970s, usually based on timer interrupts which recorded the program status word (PSW) at set timer-intervals to detect "hot spots" in executing code. This was an early example of sampling (see below). In early 1974 instruction-set simulators permitted full trace and other performance-monitoring features.
Profiler-driven program analysis on Unix dates back to 1973,7 when Unix systems included a basic tool, prof, which listed each function and how much of program execution time it used. In 1982 gprof extended the concept to a complete call graph analysis.8
In 1994, Amitabh Srivastava and Alan Eustace of Digital Equipment Corporation published a paper describing ATOM9 (Analysis Tools with OM). The ATOM platform converts a program into its own profiler: at compile time, it inserts code into the program to be analyzed. That inserted code outputs analysis data. This technique - modifying a program to analyze itself - is known as "instrumentation".
In 2004 both the gprof and ATOM papers appeared on the list of the 50 most influential PLDI papers for the 20-year period ending in 1999.10
Flat profilers compute the average call times, from the calls, and do not break down the call times based on the callee or the context.
Call graph profilers11 show the call times, and frequencies of the functions, and also the call-chains involved based on the callee. In some tools full context is not preserved.
Input-sensitive profilers121314 add a further dimension to flat or call-graph profilers by relating performance measures to features of the input workloads, such as input size or input values. They generate charts that characterize how an application's performance scales as a function of its input.
Profilers, which are also programs themselves, analyze target programs by collecting information on the target program's execution. Based on their data granularity, which depends upon how profilers collect information, they are classified as event-based or statistical profilers. Profilers interrupt program execution to collect information. Those interrupts can limit time measurement resolution, which implies that timing results should be taken with a grain of salt. Basic block profilers report a number of machine clock cycles devoted to executing each line of code, or timing based on adding those together; the timings reported per basic block may not reflect a difference between cache hits and misses.1516
Event-based profilers are available for the following programming languages:
These profilers operate by sampling. A sampling profiler probes the target program's call stack at regular intervals using operating system interrupts. Sampling profiles are typically less numerically accurate and specific, providing only a statistical approximation, but allow the target program to run at near full speed. "The actual amount of error is usually more than one sampling period. In fact, if a value is n times the sampling period, the expected error in it is the square-root of n sampling periods."17
In practice, sampling profilers can often provide a more accurate picture of the target program's execution than other approaches, as they are not as intrusive to the target program and thus don't have as many side effects (such as on memory caches or instruction decoding pipelines). Also since they don't affect the execution speed as much, they can detect issues that would otherwise be hidden. They are also relatively immune to over-evaluating the cost of small, frequently called routines or 'tight' loops. They can show the relative amount of time spent in user mode versus interruptible kernel mode such as system call processing.
Unfortunately, running kernel code to handle the interrupts incurs a minor loss of CPU cycles from the target program, diverts cache usage, and cannot distinguish the various tasks occurring in uninterruptible kernel code (microsecond-range activity) from user code. Dedicated hardware can do better: ARM Cortex-M3 and some recent MIPS processors' JTAG interfaces have a PCSAMPLE register, which samples the program counter in a truly undetectable manner, allowing non-intrusive collection of a flat profile.
Some commonly used18 statistical profilers for Java/managed code are SmartBear Software's AQtime19 and Microsoft's CLR Profiler.20 Those profilers also support native code profiling, along with Apple Inc.'s Shark (OSX),21 OProfile (Linux),22 Intel VTune and Parallel Amplifier (part of Intel Parallel Studio), and Oracle Performance Analyzer,23 among others.
This technique effectively adds instructions to the target program to collect the required information. Note that instrumenting a program can cause performance changes, and may in some cases lead to inaccurate results and/or heisenbugs. The effect will depend on what information is being collected, on the level of timing details reported, and on whether basic block profiling is used in conjunction with instrumentation.24 For example, adding code to count every procedure/routine call will probably have less effect than counting how many times each statement is obeyed. A few computers have special hardware to collect information; in this case the impact on the program is minimal.
Instrumentation is key to determining the level of control and amount of time resolution available to the profilers.
"How to find the performance bottleneck in C# desktop application?". Stack Overflow. 2012. https://stackoverflow.com/questions/13698674/how-to-find-the-performance-bottleneck-in-c-sharp-desktop-application ↩
Krauss, Kirk J (2017). "Performance Profiling with a Focus". Develop for Performance. http://www.developforperformance.com/PerformanceProfilingWithAFocus.html ↩
"What is code profiling? Learn the 3 Types of Code Profilers". Stackify Developer Tips, Tricks and Resources. Disqus. 2016. https://stackify.com/what-is-code-profiling/ ↩
Lawrence, Eric (2016). "Getting Started with Profile Guided Optimization". testslashplain. WordPress. https://textslashplain.com/2016/01/10/getting-started-with-profile-guided-optimization/ ↩
Krauss, Kirk (2018). "Matching Wildcards: An Improved Algorithm for Big Data". Develop for Performance. http://www.developforperformance.com/MatchingWildcards_AnImprovedAlgorithmForBigData.html ↩
"List of .Net Profilers: 3 Different Types and Why You Need All of Them". Stackify Developer Tips, Tricks and Resources. Disqus. 2016. https://stackify.com/three-types-of-net-profilers/ ↩
Unix Programmer's Manual, 4th Edition http://www.tuhs.org/Archive/Distributions/Research/Dennis_v4/v4man.tar.gz ↩
S.L. Graham, P.B. Kessler, and M.K. McKusick, gprof: a Call Graph Execution Profiler, Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, SIGPLAN Notices, Vol. 17, No 6, pp. 120-126; doi:10.1145/800230.806987 http://docs.freebsd.org/44doc/psd/18.gprof/paper.pdf ↩
A. Srivastava and A. Eustace, ATOM: A system for building customized program analysis tools, Proceedings of the ACM SIGPLAN Conference on Programming language design and implementation (PLDI '94), pp. 196-205, 1994; ACM SIGPLAN Notices - Best of PLDI 1979-1999 Homepage archive, Vol. 39, No. 4, pp. 528-539; doi:10.1145/989393.989446 http://www.ece.cmu.edu/~ece548/tools/atom/man/wrl_94_2.pdf ↩
20 Years of PLDI (1979–1999): A Selection, Kathryn S. McKinley, Editor http://www.cs.utexas.edu/users/mckinley/20-years.html ↩
E. Coppa, C. Demetrescu, and I. Finocchi, Input-Sensitive Profiling, IEEE Trans. Software Eng. 40(12): 1185-1205 (2014); doi:10.1109/TSE.2014.2339825 https://web.archive.org/web/20180611201601/https://ieeexplore.ieee.org/document/6858059/ ↩
D. Zaparanuks and M. Hauswirth, Algorithmic Profiling, Proceedings of the 33rd ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI 2012), ACM SIGPLAN Notices, Vol. 47, No. 6, pp. 67-76, 2012; doi:10.1145/2254064.2254074 //doi.org/10.1145/2254064.2254074 ↩
T. Kustner, J. Weidendorfer, and T. Weinzierl, Argument Controlled Profiling, Proceedings of Euro-Par 2009 – Parallel Processing Workshops, Lecture Notes in Computer Science, Vol. 6043, pp. 177-184, 2010; doi:10.1007/978-3-642-14122-5 22 //doi.org/10.1007/978-3-642-14122-5_22 ↩
"Timing and Profiling - Basic Block Profilers". OpenStax CNX Archive. https://archive.cnx.org/contents/d29c016a-2960-4fc9-b431-9eda881a28f5@3/timing-and-profiling-basic-block-profilers#id6897344 ↩
Ball, Thomas; Larus, James R. (1994). "Optimally profiling and tracing programs" (PDF). ACM Transactions on Programming Languages and Systems. 16 (4). ACM Digital Library: 1319–1360. doi:10.1145/183432.183527. S2CID 6897138. Archived from the original (PDF) on 2018-05-18. Retrieved 2018-05-18. https://web.archive.org/web/20180518195918/https://www.classes.cs.uchicago.edu/current/32001-1/papers/ball-larus-profiling.pdf ↩
Statistical Inaccuracy of gprof Output Archived 2012-05-29 at the Wayback Machine http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html#SEC12 ↩
"Popular C# Profilers". Gingtage. 2014. http://www.ginktage.com/2014/10/popular-c-profilers/ ↩
"Sampling Profiler - Overview". AQTime 8 Reference. SmartBear Software. 2018. https://support.smartbear.com/viewarticle/54581/ ↩
Wenzal, Maira; et al. (2017). "Profiling Overview". Microsoft .NET Framework Unmanaged API Reference. Microsoft. https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/profiling-overview#supported-features ↩
"Performance Tools". Apple Developer Tools. Apple, Inc. 2013. https://developer.apple.com/library/content/documentation/Performance/Conceptual/PerformanceOverview/PerformanceTools/PerformanceTools.html ↩
Netto, Zanella; Arnold, Ryan S. (2012). "Evaluate performance for Linux on Power". IBM DeveloperWorks. https://www.ibm.com/developerworks/linux/library/l-evaluatelinuxonpower/ ↩
Schmidl, Dirk; Terboven, Christian; an Mey, Dieter; Müller, Matthias S. (2013). Suitability of Performance Tools for OpenMP Task-Parallel Programs. Proc. 7th Int'l Workshop on Parallel Tools for High Performance Computing. pp. 25–37. ISBN 9783319081441. 9783319081441 ↩
Carleton, Gary; Kirkegaard, Knud; Sehr, David (1998). "Profile-Guided Optimizations". Dr. Dobb's Journal. http://www.drdobbs.com/profile-guided-optimizations/184410561 ↩