Using the gprof command (with examples)
1: Compiling binary with gprof information and generating gmon.out
file
gcc -pg program.c && ./a.out
Motivation:
Profiling a program allows us to collect data about the execution of the functions within the program. By compiling the program with gprof information and running it, we can generate a gmon.out
file that contains this profiling data. This file is required for subsequent analysis using the gprof command.
Explanation:
The gcc -pg
command compiles the program with gprof support enabled, while the ./a.out
command runs the compiled binary.
The -pg
flag tells the compiler to add extra instructions to the code so that it can collect profiling data during runtime.
Example Output: None. This command only generates the gmon.out
file for later analysis.
2: Running gprof to obtain profile output
gprof
Motivation:
Once we have the gmon.out
file generated, we can use the gprof command to analyze the profile data and obtain meaningful information about the program’s execution.
Explanation:
The gprof
command reads the gmon.out
file and generates a profile output. This output provides insights into the program’s execution, such as the number of times each function is called, the time spent in each function, and the call graph.
Example Output:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
60.50 2.14 2.14 1 2.14 2.14 main
30.25 3.28 1.14 1 1.14 1.14 foo
9.34 3.97 0.69 1 0.69 0.69 bar
...
3: Suppressing profile field’s description
gprof -b
Motivation: When producing the profile output, gprof includes a description field for each profile entry by default. However, this description might not be necessary in certain cases. By suppressing it, we can make the output more concise.
Explanation:
The -b
flag is used to suppress the description field in the profile output. This results in a more compact output without sacrificing the important profiling information.
Example Output:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self
time seconds seconds calls name
60.50 2.14 2.14 1 main
30.25 3.28 1.14 1 foo
9.34 3.97 0.69 1 bar
...
4: Displaying routines that have zero usage
gprof -bz
Motivation: In some cases, we might be interested in identifying routines or functions that are not being utilized by the program. By displaying routines with zero usage, we can easily identify potential candidates for optimization or removal.
Explanation:
The -bz
flag is used to display routines that have zero usage in the profile output. These routines are often ones that are not called by any other functions, and their inclusion in the final binary might be unnecessary.
Example Output:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
60.50 2.14 2.14 1 2.14 2.14 main
30.25 3.92 1.14 1 1.14 1.14 foo
9.25 3.67 0.69 1 0.69 0.69 bar
0.00 0.00 unused_function1
0.00 0.00 unused_function2
...
Conclusion
In this article, we explored different use cases of the gprof
command, a performance analysis tool for profiling function executions. We covered the steps to compile a binary with gprof information, run the gprof command to obtain profile outputs, suppress the profile field’s description for more concise outputs, and display routines with zero usage. Each use case is accompanied by code examples, motivations, explanations, and example outputs to help illustrate the practical applications of the gprof
command.