Boost logo

Boost :

From: michel.andre_at_[hidden]
Date: 2001-03-22 05:14:19


I have written a small package consisting of a stop_watch class and
several counter classes for timing (mostly the various timers on
Windows NT GetTickCount, QueryPerformanceCounter, mmTimer and the
likes).

They look something like this:

#include <time.h>
#include <iostream>

template <typename COUNTER>
struct stop_watch
{
    typedef double diff_type;
    ///< The type used to express differences in seconds
    typedef COUNTER::tick_type tick_type;
    ///< Type used to express Ticks in seconds

    stop_watch(const COUNTER& counter = COUNTER()) : counter_(counter)
    { reset(); }

    void start()
    {
        if (start_ != -1)
            throw "Timer already started";
        start_ = counter_.tick_count();
    };

    // stops timer throws exception if timer
    // isn't started
    void stop()
    {
        tick_type tick = counter_.tick_count();
        if (start_ == -1) throw "Timer not started";
        elapsed_ += (tick - start_);
        start_ = -1;
    };

    // resets elapsed time and start time
    void reset()
    {
        start_ = -1;
        elapsed_ = 0;
    };

    // returns total elapsed time between last
    //
    diff_type elapsed() const
    {
        tick_type diff = (start_ == -1) ? 0 :
            counter_.tick_count() - start_;
        
        return diff_type(
            static_cast<diff_type>(elapsed_ + diff)/
            static_cast<diff_type>(counter_.ticks_per_sec()));
    };
private:
    tick_type start_;
    tick_type elapsed_;
    COUNTER counter_;
};

// And the counter class using time.h clock function
struct clock_counter
{
    typedef clock_t tick_type;
    static tick_type ticks_per_sec()
    {
        return CLOCKS_PER_SEC;
    }
    static tick_type tick_count()
    {
        return clock();
    }
};

// Sample usage
int main(int argc, char* argv[])
{
        stop_watch<clock_counter> watch;
        watch.start();
        // Lengty op
        watch.stop();
        std::cout << "Elapsed:" << watch.elapsed() ;
        std::cout << " secs" << std::endl;
        return 0;
}

It's now a fairly simple approach but i think its possible to build
something among those lines wich could be quite extensible. What i
have noticed with my several counter classes that i have is that
performance can differ greatly ie the overhead of using the timer.
And of course the resolution differs.

Could this be something to build on?

I would be interested in contributing to this kind of project.

/Michel


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk