#include <Stopwatch.h> namespace SCO_SC {class Stopwatch{ public: // Constructors, destructor Stopwatch(); ~Stopwatch(); // Copy and assign Stopwatch(const Stopwatch& s); Stopwatch& operator=(const Stopwatch& s); // Status int status()const; // Setting operations void start(); void stop(); void reset(); // Reading operations double system()const; double user()const; double real()const; // Miscellaneous static double resolution(); }; }
There are three kinds of execution time that programmers may be interested in knowing about:
For purposes of estimating---and subsequently eliminating---the bias inherent in a reading due to act of measurement, it can be safely assumed that every Stopwatch operation includes a (user time) overhead on the order of a function call. Some operations also incur a (system time) overhead on the order of a system call; these are noted below.
Stopwatch(); A stopped Stopwatch (status()==0) for which system(), user(), and real() all read zero.
~Stopwatch(); Destructor
Stopwatch(const Stopwatch& s);
Stopwatch& operator=(const Stopwatch& s); Copying or assigning a Stopwatch creates a copy of its value.
int status()const; Returns 1 if the Stopwatch is running and 0 if it is stopped.
void start(); If the Stopwatch is already running, the call has no effect. If the Stopwatch is stopped, it starts running and measurement resumes from where it left off. Requires a system call if the status changes from stopped to running.
void stop(); If the Stopwatch is already stopped, the call has no effect. If the Stopwatch is running, it stops running and measurement is halted. Requires a system call if the status changes from running to stopped.
void reset(); Resets system(), user(), and real() to zero. The status is not affected by this call; that is, if the Stopwatch is running, it continues running uninterrupted after resetting, and if it is stopped, it remains stopped after resetting. Always requires a system call.
double system()const;
double user()const;
double real()const; Returns the system time, user time, and real time, respectively, in units of seconds. Requires a system call if the Stopwatch is running.
static double resolution(); Returns the (system-dependent) resolution of Stopwatches in units of seconds. On a system where resolution() is 1/60 second (a typical value), Stopwatch readings are accurate only to the nearest 1/60 second.
Stopwatches encapsulate the facilities of times(2).
The following program computes the user time for a computation of interest. Taking an average over N repetitions decreases the effect of Stopwatch inaccuracy to an acceptable level:
#include <Stopwatch.h> #include <stream.h> const int N = 10000; main(){ Stopwatch w; w.start(); for(int i=0;i<N;i++){ computation of interest } w.stop(); cout << "user time=" << w.user()/N << "\n"; }