97 lines
2.3 KiB
Plaintext
97 lines
2.3 KiB
Plaintext
@node Profiling of program phases
|
|
@section Profiling of program phases
|
|
|
|
@mindex timevar
|
|
The module @samp{timevar} provides a simple self-profiling facility,
|
|
based on timers.
|
|
|
|
@smallexample
|
|
Execution times (seconds)
|
|
read : 0.09 (19%) usr 0.08 (80%) sys 0.09 (18%) wall
|
|
read: scan : 0.04 ( 9%) usr 0.08 (80%) sys 0.12 (26%) wall
|
|
read: parse : 0.05 (10%) usr 0.00 ( 0%) sys 0.05 (10%) wall
|
|
work : 0.33 (70%) usr 0.00 ( 0%) sys 0.35 (71%) wall
|
|
work: phase 1 : 0.30 (64%) usr 0.00 ( 0%) sys 0.30 (64%) wall
|
|
work: phase 2 : 0.13 (28%) usr 0.00 ( 0%) sys 0.14 (29%) wall
|
|
output : 0.04 ( 9%) usr 0.02 (20%) sys 0.04 ( 8%) wall
|
|
total time : 0.47 0.10 0.49
|
|
@end smallexample
|
|
|
|
To set up @code{timevar}, copy the stub file
|
|
@file{gnulib/lib/timevar.def} next to where @file{timevar.h} and
|
|
@file{timevar.c} were imported in your project, and define your timers
|
|
there. For instance:
|
|
|
|
@smallexample
|
|
/* The total execution time. Mandatory. */
|
|
DEFTIMEVAR (tv_total, "total time")
|
|
|
|
/* Examples. */
|
|
DEFTIMEVAR (tv_read, "read")
|
|
DEFTIMEVAR (tv_work, "work")
|
|
DEFTIMEVAR (tv_work_1, "work: phase 1")
|
|
DEFTIMEVAR (tv_work_2, "work: phase 2")
|
|
DEFTIMEVAR (tv_output, "output")
|
|
@end smallexample
|
|
|
|
Do not remove @code{tv_total}, it is mandatory. You may change its
|
|
associated string.
|
|
|
|
@sp 1
|
|
|
|
Use @code{timevar_push}/@code{timevar_pop} to start/stop timers, as in
|
|
the following example.
|
|
|
|
@smallexample
|
|
#include <config.h>
|
|
#include "timevar.h"
|
|
|
|
#include <stdio.h>
|
|
#include "read.h"
|
|
#include "work.h"
|
|
#include "output.h"
|
|
|
|
int
|
|
main (void)
|
|
@{
|
|
timevar_enabled = true;
|
|
timevar_init ();
|
|
timevar_start (tv_total);
|
|
|
|
timevar_push (tv_read);
|
|
reader ();
|
|
timevar_pop (tv_read);
|
|
|
|
timevar_push (tv_work);
|
|
work ();
|
|
timevar_pop (tv_work);
|
|
|
|
timevar_push (tv_output);
|
|
output ();
|
|
timevar_pop (tv_output);
|
|
|
|
timevar_stop (tv_total);
|
|
timevar_print (stderr);
|
|
@}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
with, for instance, in @file{work.c}
|
|
|
|
@smallexample
|
|
#include <config.h>
|
|
#include "work.h"
|
|
|
|
void
|
|
work (void)
|
|
@{
|
|
timevar_push (tv_work_phase1);
|
|
work1 ();
|
|
timevar_pop (tv_work_phase1);
|
|
|
|
timevar_push (tv_work_phase2);
|
|
work2 ();
|
|
timevar_pop (tv_work_phase2);
|
|
@}
|
|
@end smallexample
|