181 lines
4.5 KiB
OpenEdge ABL
181 lines
4.5 KiB
OpenEdge ABL
|
//
|
||
|
// $Header$
|
||
|
//
|
||
|
// timers.i
|
||
|
// A SWIG file for adding various timing functions.
|
||
|
// Really, this is modeled after the timers in the CMMD
|
||
|
// message passing library for the CM-5.
|
||
|
//
|
||
|
// Dave Beazley
|
||
|
// April 2, 1996
|
||
|
//
|
||
|
/* Revision history
|
||
|
* $Log$
|
||
|
* Revision 1.1 2002/04/29 19:56:49 RD
|
||
|
* Since I have made several changes to SWIG over the years to accomodate
|
||
|
* special cases and other things in wxPython, and since I plan on making
|
||
|
* several more, I've decided to put the SWIG sources in wxPython's CVS
|
||
|
* instead of relying on maintaining patches. This effectivly becomes a
|
||
|
* fork of an obsolete version of SWIG, :-( but since SWIG 1.3 still
|
||
|
* doesn't have some things I rely on in 1.1, not to mention that my
|
||
|
* custom patches would all have to be redone, I felt that this is the
|
||
|
* easier road to take.
|
||
|
*
|
||
|
* Revision 1.1.1.1 1999/02/28 02:00:53 beazley
|
||
|
* Swig1.1
|
||
|
*
|
||
|
* Revision 1.1 1996/05/22 17:27:01 beazley
|
||
|
* Initial revision
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
%module timers
|
||
|
%{
|
||
|
|
||
|
#include <time.h>
|
||
|
#define SWIG_NTIMERS 64
|
||
|
|
||
|
static clock_t telapsed[SWIG_NTIMERS];
|
||
|
static clock_t tstart[SWIG_NTIMERS];
|
||
|
static clock_t tend[SWIG_NTIMERS];
|
||
|
|
||
|
/*-----------------------------------------------------------------
|
||
|
* SWIG_timer_clear(int i)
|
||
|
*
|
||
|
* Clears timer i.
|
||
|
*----------------------------------------------------------------- */
|
||
|
|
||
|
void
|
||
|
SWIG_timer_clear(int i)
|
||
|
{
|
||
|
if ((i >= 0) && (i < SWIG_NTIMERS))
|
||
|
telapsed[i] = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*-----------------------------------------------------------------
|
||
|
* SWIG_timer_start(int i)
|
||
|
*
|
||
|
* Starts timer i
|
||
|
*----------------------------------------------------------------- */
|
||
|
|
||
|
void
|
||
|
SWIG_timer_start(int i)
|
||
|
{
|
||
|
if ((i >= 0) && (i < SWIG_NTIMERS))
|
||
|
tstart[i] = clock();
|
||
|
}
|
||
|
|
||
|
|
||
|
/*-----------------------------------------------------------------
|
||
|
* SWIG_timer_stop(int i)
|
||
|
*
|
||
|
* Stops timer i and accumulates elapsed time
|
||
|
*----------------------------------------------------------------- */
|
||
|
|
||
|
void
|
||
|
SWIG_timer_stop(int i)
|
||
|
{
|
||
|
if ((i >= 0) && (i < SWIG_NTIMERS)) {
|
||
|
tend[i] = clock();
|
||
|
telapsed[i] += (tend[i] - tstart[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*-----------------------------------------------------------------
|
||
|
* SWIG_timer_elapsed(int i)
|
||
|
*
|
||
|
* Returns the time elapsed on timer i in seconds.
|
||
|
*----------------------------------------------------------------- */
|
||
|
|
||
|
double
|
||
|
SWIG_timer_elapsed(int i)
|
||
|
{
|
||
|
double t;
|
||
|
if ((i >= 0) && (i < SWIG_NTIMERS)) {
|
||
|
t = (double) telapsed[i]/(double) CLOCKS_PER_SEC;
|
||
|
return(t);
|
||
|
} else {
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
%}
|
||
|
|
||
|
%section "Timer Functions",pre,after,chop_left=3,nosort,info,chop_right = 0, chop_top=0,chop_bottom=0
|
||
|
|
||
|
%text %{
|
||
|
%include timers.i
|
||
|
|
||
|
This module provides a collection of timing functions designed for
|
||
|
performance analysis and benchmarking of different code fragments.
|
||
|
|
||
|
A total of 64 different timers are available. Each timer can be
|
||
|
managed independently using four functions :
|
||
|
|
||
|
timer_clear(int n) Clears timer n
|
||
|
timer_start(int n) Start timer n
|
||
|
timer_stop(int n) Stop timer n
|
||
|
timer_elapsed(int n) Return elapsed time (in seconds)
|
||
|
|
||
|
All timers measure CPU time.
|
||
|
|
||
|
Since each timer can be accessed independently, it is possible
|
||
|
to use groups of timers for measuring different aspects of code
|
||
|
performance. To use a timer, simply use code like this :
|
||
|
%}
|
||
|
|
||
|
#if defined(SWIGTCL)
|
||
|
%text %{
|
||
|
timer_clear 0
|
||
|
timer_start 0
|
||
|
.. a bunch of Tcl code ...
|
||
|
timer_stop 0
|
||
|
puts "[timer_elapsed 0] seconds of CPU time"
|
||
|
%}
|
||
|
#elif defined(SWIGPERL)
|
||
|
%text %{
|
||
|
timer_clear(0);
|
||
|
timer_start(0);
|
||
|
.. a bunch of Perl code ...
|
||
|
timer_stop(0);
|
||
|
print timer_elapsed(0)," seconds of CPU time\n";
|
||
|
%}
|
||
|
#elif defined(SWIGPYTHON)
|
||
|
%text %{
|
||
|
timer_clear(0)
|
||
|
timer_start(0)
|
||
|
... a bunch of Python code ...
|
||
|
timer_stop(0)
|
||
|
print timer_elapsed(0)," seconds of CPU time"
|
||
|
%}
|
||
|
#endif
|
||
|
|
||
|
%text %{
|
||
|
A single timer can be stopped and started repeatedly to provide
|
||
|
a cummulative timing effect.
|
||
|
|
||
|
As a general performance note, making frequent calls to the timing
|
||
|
functions can severely degrade performance (due to operating system
|
||
|
overhead). The resolution of the timers may be poor for extremely
|
||
|
short code fragments. Therefore, the timers work best for
|
||
|
computationally intensive operations.
|
||
|
%}
|
||
|
|
||
|
|
||
|
%name(timer_clear) void SWIG_timer_clear(int n);
|
||
|
/* Clears timer n. */
|
||
|
|
||
|
%name(timer_start) void SWIG_timer_start(int n);
|
||
|
/* Starts timer n. */
|
||
|
|
||
|
%name(timer_stop) void SWIG_timer_stop(int n);
|
||
|
/* Stops timer n. */
|
||
|
|
||
|
%name(timer_elapsed) double SWIG_timer_elapsed(int n);
|
||
|
/* Return the elapsed time (in seconds) of timer n */
|
||
|
|
||
|
|
||
|
|
||
|
|