Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: timer.h
- Revision:
- 0:ee91220d7bea
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/timer.h Tue Nov 30 23:53:06 2010 +0000 @@ -0,0 +1,126 @@ +#ifndef TIMER_H +#define TIMER_H + +#include <ctime> +#include <iostream> +#include <iomanip> + +class timer +{ + friend std::ostream& operator<<(std::ostream& os, timer& t); + + private: + bool running; + clock_t start_clock; + time_t start_time; + double acc_time; + + double elapsed_time(); + + public: + // 'running' is initially false. A timer needs to be explicitly started + // using 'start' or 'restart' + timer() : running(false), start_clock(0), start_time(0), acc_time(0) { } + + void start(const char* msg = 0); + void restart(const char* msg = 0); + void stop(const char* msg = 0); + void check(const char* msg = 0); + +}; // class timer + +//=========================================================================== +// Return the total time that the timer has been in the "running" +// state since it was first "started" or last "restarted". For +// "short" time periods (less than an hour), the actual cpu time +// used is reported instead of the elapsed time. + +inline double timer::elapsed_time() +{ + time_t acc_sec = time(0) - start_time; + if (acc_sec < 3600) + return (clock() - start_clock) / (1.0 * CLOCKS_PER_SEC); + else + return (1.0 * acc_sec); + +} // timer::elapsed_time + +//=========================================================================== +// Start a timer. If it is already running, let it continue running. +// Print an optional message. + +inline void timer::start(const char* msg) +{ + // Print an optional message, something like "Starting timer t"; + if (msg) std::cout << msg << std::endl; + + // Return immediately if the timer is already running + if (running) return; + + // Set timer status to running and set the start time + running = true; + start_clock = clock(); + start_time = time(0); + +} // timer::start + +//=========================================================================== +// Turn the timer off and start it again from 0. Print an optional message. + +inline void timer::restart(const char* msg) +{ + // Print an optional message, something like "Restarting timer t"; + if (msg) std::cout << msg << std::endl; + + // Set timer status to running, reset accumulated time, and set start time + running = true; + acc_time = 0; + start_clock = clock(); + start_time = time(0); + +} // timer::restart + +//=========================================================================== +// Stop the timer and print an optional message. + +inline void timer::stop(const char* msg) +{ + // Print an optional message, something like "Stopping timer t"; + if (msg) std::cout << msg << std::endl; + + // Compute accumulated running time and set timer status to not running + if (running) acc_time += elapsed_time(); + running = false; + +} // timer::stop + +//=========================================================================== +// Print out an optional message followed by the current timer timing. + +inline void timer::check(const char* msg) +{ + // Print an optional message, something like "Checking timer t"; + if (msg) std::cout << msg << " : "; + + std::cout << "Elapsed time [" << std::setiosflags(std::ios::fixed) + << std::setprecision(2) + << acc_time + (running ? elapsed_time() : 0) << "] seconds\n"; + +} // timer::check + +//=========================================================================== +// Allow timers to be printed to ostreams using the syntax 'os << t' +// for an ostream 'os' and a timer 't'. For example, "cout << t" will +// print out the total amount of time 't' has been "running". + +inline std::ostream& operator<<(std::ostream& os, timer& t) +{ + os << std::setprecision(2) << std::setiosflags(std::ios::fixed) + << t.acc_time + (t.running ? t.elapsed_time() : 0); + return os; +} + +//=========================================================================== + +#endif // TIMER_H +