Skip to content
Snippets Groups Projects
Commit 3c128240 authored by Carsten Gräser's avatar Carsten Gräser
Browse files

Added methods to stop the Timer and to start it again.

[[Imported from SVN: r5627]]
parent 98cbf9eb
No related branches found
No related tags found
No related merge requests found
...@@ -46,42 +46,107 @@ namespace Dune { ...@@ -46,42 +46,107 @@ namespace Dune {
{ {
public: public:
//! A new timer, start immediately //! A new timer, reset and start immediately.
Timer () throw(TimerError) Timer () throw(TimerError)
{ {
isRunning_ = true;
reset(); reset();
} }
//! Reset timer
//! Reset timer and restart if running.
void reset() throw (TimerError) void reset() throw (TimerError)
{ {
sumElapsed_ = 0.0;
storedLastElapsed_ = 0.0;
rawReset();
}
//! Start the timer and continue measurement if it is not running. Otherwise do nothing.
void start() throw (TimerError)
{
if (not (isRunning_))
{
rawReset();
isRunning_ = true;
}
}
//! Get elapsed user-time from last reset until now/last stop in seconds.
double elapsed () const throw (TimerError)
{
// if timer is running add the time elapsed since last start to sum
if (isRunning_)
return sumElapsed_ + lastElapsed();
return sumElapsed_;
}
//! Get elapsed user-time from last start until now/last stop in seconds.
double lastElapsed () const throw (TimerError)
{
// if timer is running return the current value
if (isRunning_)
return rawElapsed();
// if timer is not running return stored value from last run
return storedLastElapsed_;
}
//! Stop the timer and return elapsed().
double stop() throw (TimerError)
{
if (isRunning_)
{
// update storedLastElapsed_ and sumElapsed_ and stop timer
storedLastElapsed_ = lastElapsed();
sumElapsed_ += storedLastElapsed_;
isRunning_ = false;
}
return elapsed();
}
private:
bool isRunning_;
double sumElapsed_;
double storedLastElapsed_;
#ifdef TIMER_USE_STD_CLOCK #ifdef TIMER_USE_STD_CLOCK
void rawReset() throw (TimerError)
{
cstart = std::clock(); cstart = std::clock();
}
double rawElapsed () const throw (TimerError)
{
return (std::clock()-cstart) / static_cast<double>(CLOCKS_PER_SEC);
}
std::clock_t cstart;
#else #else
void rawReset() throw (TimerError)
{
rusage ru; rusage ru;
if (getrusage(RUSAGE_SELF, &ru)) if (getrusage(RUSAGE_SELF, &ru))
DUNE_THROW(TimerError, strerror(errno)); DUNE_THROW(TimerError, strerror(errno));
cstart = ru.ru_utime; cstart = ru.ru_utime;
#endif
} }
//! Get elapsed user-time in seconds double rawElapsed () const throw (TimerError)
double elapsed () const throw (TimerError)
{ {
#ifdef TIMER_USE_STD_CLOCK
return (std::clock()-cstart) / static_cast<double>(CLOCKS_PER_SEC);
#else
rusage ru; rusage ru;
if (getrusage(RUSAGE_SELF, &ru)) if (getrusage(RUSAGE_SELF, &ru))
DUNE_THROW(TimerError, strerror(errno)); DUNE_THROW(TimerError, strerror(errno));
return 1.0 * (ru.ru_utime.tv_sec - cstart.tv_sec) + (ru.ru_utime.tv_usec - cstart.tv_usec) / (1000.0 * 1000.0); return 1.0 * (ru.ru_utime.tv_sec - cstart.tv_sec) + (ru.ru_utime.tv_usec - cstart.tv_usec) / (1000.0 * 1000.0);
#endif
} }
private:
#ifdef TIMER_USE_STD_CLOCK
std::clock_t cstart;
#else
struct timeval cstart; struct timeval cstart;
#endif #endif
}; // end class Timer }; // end class Timer
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment