english
version "1.0"
identify "xyz"
#: Copyright (c) 1994-2005 by Wayne C. Gramlich.
#, All rights reserved.
module timer
#: The system module provides a way of measuring program performance
#, via a set of hiearchical timers.
#,
#, This module is used by creating a single {timers} object at the
#, beginning of program execution and then building a nested set
#, of {timer} objects off of that. At any one time only one {timer}
#, object is collecting time. At the end of program execution,
#, {dump}@{timers}() is called to show where all of the program
#, time was spent.
define timer #: One performance timer
record
child_nanoseconds unsigned #: Children nanoseconds
child_seconds unsigned #: Children seconds
count unsigned #: Number of times timer is used
hash unsigned #: Hash of {title}
nanoseconds unsigned #: Total nanoseconds
parent timer #: Parent timer or ??
seconds unsigned #: Total seconds
subtimers vector[timer] #: Sub-{timers} of this one
timers timers #: {timers} object containing this {timer}
title string #: Title of timer
generate allocate, erase, print
define timers #: A collection of performance timers
record
current timer #: Current {timer} (only one active at a time)
debug logical #: {true} print debugging information
disabled logical #: {true} do not do any timing
out_stream out_stream #: All timer information is output here
program_name string #: Program name
stack vector[timer] #: Stack of timers
time time #: {time} object for high resolution time.
top timer #: Top level timer for entire program
generate allocate, erase, print
#: {timers} procedures:
procedure xcreate@timers
takes
program_name string
out_stream out_stream
returns timers
#: This procedure will create and return a new {timers} object
#, with a name of {program_name} and an output stream of {out_stream}.
procedure create@timers
takes
program_name string
out_stream out_stream
returns timers
#: This procedure will create and return a new {timers} object
#, with a name of {program_name} and an output stream of {out_stream}.
#: Return the result:
procedure dump@timers
takes
timers timers
out_stream out_stream
returns_nothing
#: This procudure will output the timer values associated with each
#, {timer} in {timers} to {out_stream}.
#: {timer} procedures:
procedure create@timer
takes
parent timer
timers timers
title string
returns timer
#: This procedure creates and returns an initialized {timer} object
#, associated with {timers{ with a title of {title} and a parent
#, of {parent}. The top-most timer is accessed via {timer}.{top}.
#, Time collection is enabled with {enable}@({timer}.{top})
procedure child_create@timer
takes
parent timer
title string
returns timer
#: This procedure will create and return a child {timer} object
#, whose parent timer is {parent} and whose title on output
#, is {title}.
procedure child_once@timer
takes
parent timer
title string
returns timer
#: This procedure will search through {parent} looking for
#, a child timer with a title of {title} and return it;
#, if now matching child timer is found, one is created
#, and returned. The returned timer is not set to be the
#, current one.
procedure child_next@timer
takes
parent timer
title string
returns timer
#: This procedure will get the child timer named {title} from {parent}
#, (or create it if it does not exist), make it the current timer,
#, and return it.
procedure child_create_current@timer
takes
parent timer
title string
returns timer
#: This procedure will create and return a child {timer} object
#, whose parent timer is {parent} and whose title on output
#, is {title}. The returned {timer} is set to the current timer.
procedure current_set@timer
takes
timer timer
returns_nothing
#: This procedure will make {timer} the current timer.
procedure disable@timer
takes
timer timer
returns_nothing
#: This procedure will disable all timers. {timer} is used to
#, access the {timers} object.
procedure enable@timer
takes
timer timer
returns_nothing
#: This procedure will enable all timers. {timer} is used to
#, access the {timers} object.
procedure push@timer
takes
timer timer
returns_nothing
#: This procedure will make {timer} be current. The previous
#, timer is pushed onto a stack for subsequenter poping.
procedure pop@timer
takes
timer timer
returns_nothing
#: This procedure will restore the previous timer. {timer} is only
#, used to access the timer stack.
procedure dump@timer
takes
timer timer
level unsigned
out_stream out_stream
returns_nothing
#: This procedure will output {timer} to {out_stream} indented by {level}.
procedure sum@timer
takes
timer timer
returns_nothing
#: This procedure will fill in the total time used by {timer}'s children.