marci@73: // -*- c++ -*-
marci@259: #ifndef HUGO_TIME_MEASURE_H
marci@259: #define HUGO_TIME_MEASURE_H
marci@73: 
marci@73: #include <sys/time.h>
alpar@117: #include <sys/times.h>
alpar@117: #include <fstream>
alpar@117: #include <iostream>
jacint@121: #include <unistd.h>
marci@73: 
marci@73: double currTime() {
marci@73:   timeval tv;
marci@73:   //timezone tz;
marci@73:   gettimeofday(&tv, 0);
marci@73:   return double(tv.tv_sec)+double(tv.tv_usec)/1000000.0;
marci@73: }
marci@73: 
alpar@117: class TimeStamp
alpar@117: {
alpar@117:   tms ts;
alpar@118:   double real_time;
alpar@118:   
alpar@117: public:
alpar@117: 
alpar@117:   tms &getTms() {return ts;}
alpar@117:   const tms &getTms() const {return ts;}
alpar@118:   double getRealTime() const {return real_time;}
alpar@118:   void stamp()
alpar@118:   {
alpar@118:     timeval tv;
alpar@118:     times(&ts);
alpar@118:     gettimeofday(&tv, 0);real_time=tv.tv_sec+double(tv.tv_usec)/1e6;
alpar@118:   }
alpar@118:   
alpar@118:   TimeStamp()
alpar@118:   { ts.tms_utime=ts.tms_stime=ts.tms_cutime=ts.tms_cstime=0; real_time=0;}
alpar@118:   
alpar@117:   TimeStamp(void *) { stamp();}
alpar@117:   
alpar@117:   TimeStamp &operator+=(const TimeStamp &b)
alpar@117:   {
alpar@117:     ts.tms_utime+=b.ts.tms_utime;
alpar@117:     ts.tms_stime+=b.ts.tms_stime;
alpar@117:     ts.tms_cutime+=b.ts.tms_cutime;
alpar@117:     ts.tms_cstime+=b.ts.tms_cstime;
alpar@118:     real_time+=b.real_time;
alpar@117:     return *this;
alpar@117:   }
alpar@117:   TimeStamp operator+(const TimeStamp &b) const
alpar@117:   {
alpar@117:     TimeStamp t(*this);
alpar@117:     return t+=b;
alpar@117:   }
alpar@117:   TimeStamp &operator-=(const TimeStamp &b)
alpar@117:   {
alpar@117:     ts.tms_utime-=b.ts.tms_utime;
alpar@117:     ts.tms_stime-=b.ts.tms_stime;
alpar@117:     ts.tms_cutime-=b.ts.tms_cutime;
alpar@117:     ts.tms_cstime-=b.ts.tms_cstime;
alpar@118:     real_time-=b.real_time;
alpar@117:     return *this;
alpar@117:   }
alpar@117:   TimeStamp operator-(const TimeStamp &b) const
alpar@117:   {
alpar@117:     TimeStamp t(*this);
alpar@117:     return t-=b;
alpar@117:   }
alpar@117: 
alpar@117:   TimeStamp Ellapsed() const
alpar@117:   {
alpar@117:     TimeStamp t(NULL);
alpar@117:     return t-*this;
alpar@117:   }
alpar@117:   
alpar@117:   friend std::ostream& operator<<(std::ostream& os,const TimeStamp &t);
alpar@117:   
alpar@118:   double getUserTime() const
alpar@118:   {
alpar@124:     return double(ts.tms_utime)/sysconf(_SC_CLK_TCK);
alpar@118:   }
alpar@118:   double getSystemTime() const
alpar@118:   {
alpar@124:     return double(ts.tms_stime)/sysconf(_SC_CLK_TCK);
alpar@118:   }
alpar@118:   double getCUserTime() const
alpar@118:   {
alpar@124:     return double(ts.tms_cutime)/sysconf(_SC_CLK_TCK);
alpar@118:   }
alpar@118:   double getCSystemTime() const
alpar@118:   {
alpar@124:     return double(ts.tms_cstime)/sysconf(_SC_CLK_TCK);
alpar@118:   }
alpar@117: };
alpar@117: 
alpar@117: class Timer
alpar@117: {
alpar@117:   TimeStamp start_time;
alpar@117: 
alpar@124:   void _reset() {start_time.stamp();}
alpar@128:   
alpar@117: public: 
alpar@124:   Timer() {_reset();}
alpar@117: 
alpar@117:   operator TimeStamp ()
alpar@117:   {
alpar@117:     TimeStamp t;
alpar@117:     t.stamp();
alpar@117:     return t-start_time;
alpar@124:   }
alpar@128: 
alpar@124:   TimeStamp reset()
alpar@124:   {
alpar@124:     TimeStamp t(start_time);
alpar@124:     _reset();
alpar@124:     return start_time-t;
alpar@124:   }
alpar@117: };
alpar@117: 
alpar@117: inline std::ostream& operator<<(std::ostream& os,const TimeStamp &t)
alpar@117: {
alpar@117:   long cls = sysconf(_SC_CLK_TCK);
alpar@118:   os << "u: " << double(t.getTms().tms_utime)/cls <<
alpar@117:     "s, s: " << double(t.getTms().tms_stime)/cls <<
alpar@117:     "s, cu: " << double(t.getTms().tms_cutime)/cls <<
alpar@118:     "s, cs: " << double(t.getTms().tms_cstime)/cls <<
alpar@118:     "s, real: " << t.getRealTime() << "s";
alpar@117:   return os;
alpar@117: }
alpar@117: 
marci@259: #endif //HUGO_TIME_MEASURE_H