summaryrefslogtreecommitdiffstats
path: root/usr.bin/gprof
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>2005-10-07 10:59:41 +0000
committerbde <bde@FreeBSD.org>2005-10-07 10:59:41 +0000
commita5d56eaf9fe2683eac471e46637802b871644aa2 (patch)
tree59f0a66183febfd5642e7efa04be07f6a040d695 /usr.bin/gprof
parent5c01c35a0c618ecd1f757f8d8b343b228d333465 (diff)
downloadFreeBSD-src-a5d56eaf9fe2683eac471e46637802b871644aa2.zip
FreeBSD-src-a5d56eaf9fe2683eac471e46637802b871644aa2.tar.gz
Improve printing of self times in the flat profile for functions that
appear to be never called: (1) If a function is never called according to its call count but it must have been called because its child time is nonzero, then print it in the flat profile. Previously, if its call count was zero then we only printed it in the flat profile if its self time was nonzero. (2) If a function has a zero call count but has a nonzero self or child time, then print its total self time in the self time per call column as a percentage of the total (self + child) time. It is not possible to print the times per call in this case because the call count is zero. Previously, this was handled by leaving both per-call columns blank. The self time is printed in another column but there was no way to recover the total time. (1) partially fixes the case of the "never called" function main() and prepares for (2) to apply to main() and other functions. Profiling of main() was lost in the conversion from a.out to ELF, so main()'s call count has always been zero for many years; then in the common case where main() is a tiny function, it gets no profiling ticks, so main() was completely lost in the flat profile. (2) improves mainly cases like kernel threads. Most kernel threads appear to be never called because they are always started before userland can run to turn on profiling. As for main(), the fact that they are called is not very interesting and their callers are uninteresting, but their relative self time is interesting since they are long-running. Almost always printing percentages in the per-call columns would be more useful than almost always printing 0.0ms. 0.1ms is now a long time, so only very large functions take that long per call. The accuracy per call can approach 1-10 nsec provided programs are run for about 100000 times as long as is necessary to get this accuracy with high resolution kernel profiling.
Diffstat (limited to 'usr.bin/gprof')
-rw-r--r--usr.bin/gprof/printgprof.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/usr.bin/gprof/printgprof.c b/usr.bin/gprof/printgprof.c
index 4ca5395..41c1c1f 100644
--- a/usr.bin/gprof/printgprof.c
+++ b/usr.bin/gprof/printgprof.c
@@ -130,7 +130,8 @@ flatprofline( np )
register nltype *np;
{
- if ( zflag == 0 && np -> ncall == 0 && np -> time == 0 ) {
+ if ( zflag == 0 && np -> ncall == 0 && np -> time == 0 &&
+ np -> childtime == 0 ) {
return;
}
actime += np -> time;
@@ -153,6 +154,9 @@ flatprofline( np )
printf( " %8ld %8.2f %8.2f " , np -> ncall ,
1000 * np -> time / hz / np -> ncall ,
1000 * ( np -> time + np -> childtime ) / hz / np -> ncall );
+ } else if ( np -> time != 0 || np -> childtime != 0 ) {
+ printf( " %8ld %7.2f%% %8.8s " , np -> ncall ,
+ 100 * np -> time / ( np -> time + np -> childtime ) , "" );
} else {
printf( " %8.8s %8.8s %8.8s " , "" , "" , "" );
}
OpenPOWER on IntegriCloud