[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gprof
Output
6.1 Statistical Sampling Error Statistical margins of error 6.2 Estimating children
TimesEstimating children times
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The run-time figures that gprof
gives you are based on a sampling
process, so they are subject to statistical inaccuracy. If a function runs
only a small amount of time, so that on the average the sampling process
ought to catch that function in the act only once, there is a pretty good
chance it will actually find that function zero times, or twice.
By contrast, the number-of-calls and basic-block figures are derived by counting, not sampling. They are completely accurate and will not vary from run to run if your program is deterministic.
The sampling period that is printed at the beginning of the flat profile says how often samples are taken. The rule of thumb is that a run-time figure is accurate if it is considerably bigger than the sampling period.
The actual amount of error can be predicted.
For n samples, the expected error
is the square-root of n. For example,
if the sampling period is 0.01 seconds and foo
's run-time is 1 second,
n is 100 samples (1 second/0.01 seconds), sqrt(n) is 10 samples, so
the expected error in foo
's run-time is 0.1 seconds (10*0.01 seconds),
or ten percent of the observed value.
Again, if the sampling period is 0.01 seconds and bar
's run-time is
100 seconds, n is 10000 samples, sqrt(n) is 100 samples, so
the expected error in bar
's run-time is 1 second,
or one percent of the observed value.
It is likely to
vary this much on the average from one profiling run to the next.
(Sometimes it will vary more.)
This does not mean that a small run-time figure is devoid of information. If the program's total run-time is large, a small run-time for one function does tell you that that function used an insignificant fraction of the whole program's time. Usually this means it is not worth optimizing.
One way to get more accuracy is to give your program more (but similar)
input data so it will take longer. Another way is to combine the data from
several runs, using the `-s' option of gprof
. Here is how:
gprof -s executable-file gmon.out gmon.sum |
gprof executable-file gmon.sum > output-file |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
children
Times
Some of the figures in the call graph are estimates--for example, the
children
time values and all the the time figures in caller and
subroutine lines.
There is no direct information about these measurements in the profile
data itself. Instead, gprof
estimates them by making an assumption
about your program that might or might not be true.
The assumption made is that the average time spent in each call to any
function foo
is not correlated with who called foo
. If
foo
used 5 seconds in all, and 2/5 of the calls to foo
came
from a
, then foo
contributes 2 seconds to a
's
children
time, by assumption.
This assumption is usually true enough, but for some programs it is far
from true. Suppose that foo
returns very quickly when its argument
is zero; suppose that a
always passes zero as an argument, while
other callers of foo
pass other arguments. In this program, all the
time spent in foo
is in the calls from callers other than a
.
But gprof
has no way of knowing this; it will blindly and
incorrectly charge 2 seconds of time in foo
to the children of
a
.
We hope some day to put more complete data into `gmon.out', so that this assumption is no longer needed, if we can figure out how. For the nonce, the estimated figures are usually more useful than misleading.
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |