00001 #ifndef DUNE_TIMER_HH
00002 #define DUNE_TIMER_HH
00003
00004 #ifndef TIMER_USE_STD_CLOCK
00005
00006 #include <sys/resource.h>
00007 #endif
00008
00009 #include <ctime>
00010
00011
00012 #include <cstring>
00013
00014
00015 #include <cerrno>
00016
00017 #include "exceptions.hh"
00018
00019 namespace hdnum {
00020
00026 class TimerError : public SystemError {} ;
00027
00028
00041 class Timer
00042 {
00043 public:
00045 Timer () throw(TimerError)
00046 {
00047 reset();
00048 }
00049
00051 void reset() throw (TimerError)
00052 {
00053 #ifdef TIMER_USE_STD_CLOCK
00054 cstart = std::clock();
00055 #else
00056 rusage ru;
00057 if (getrusage(RUSAGE_SELF, &ru))
00058 HDNUM_THROW(TimerError, strerror(errno));
00059 cstart = ru.ru_utime;
00060 #endif
00061 }
00062
00064 double elapsed () const throw (TimerError)
00065 {
00066 #ifdef TIMER_USE_STD_CLOCK
00067 return (std::clock()-cstart) / static_cast<double>(CLOCKS_PER_SEC);
00068 #else
00069 rusage ru;
00070 if (getrusage(RUSAGE_SELF, &ru))
00071 HDNUM_THROW(TimerError, strerror(errno));
00072 return 1.0 * (ru.ru_utime.tv_sec - cstart.tv_sec) + (ru.ru_utime.tv_usec - cstart.tv_usec) / (1000.0 * 1000.0);
00073 #endif
00074 }
00075
00076 private:
00077 #ifdef TIMER_USE_STD_CLOCK
00078 std::clock_t cstart;
00079 #else
00080 struct timeval cstart;
00081 #endif
00082 };
00083
00084 }
00085
00086 #endif