src/work/marci/time_measure.h
author marci
Thu, 22 Apr 2004 16:07:17 +0000
changeset 376 5c12f3515452
parent 324 c8b0ad782bda
child 425 4fbe868c1fb4
permissions -rw-r--r--
preflow mods
     1 // -*- c++ -*-
     2 #ifndef HUGO_TIME_MEASURE_H
     3 #define HUGO_TIME_MEASURE_H
     4 
     5 #include <sys/time.h>
     6 #include <sys/times.h>
     7 #include <fstream>
     8 #include <iostream>
     9 #include <unistd.h>
    10 
    11 namespace hugo {
    12 
    13 //   double currTime() {
    14 //     timeval tv;
    15 //     //timezone tz;
    16 //     gettimeofday(&tv, 0);
    17 //     return double(tv.tv_sec)+double(tv.tv_usec)/1000000.0;
    18 //   }
    19 
    20   /// Class to store (cpu)time instances.
    21 
    22   /// This class stores five time values.
    23   /// - a real time
    24   /// - a user cpu time
    25   /// - a system cpu time
    26   /// - a user cpu time of children
    27   /// - a system cpu time of children
    28   ///
    29   /// TimeStamp's can be added to or substracted from each other and
    30   /// they can be push to a stream.
    31 
    32   class TimeStamp
    33   {
    34     tms ts;
    35     double real_time;
    36   
    37   public:
    38 
    39     tms &getTms() {return ts;}
    40     const tms &getTms() const {return ts;}
    41     double getRealTime() const {return real_time;}
    42     ///Read the current time values of the process.
    43     void stamp()
    44     {
    45       timeval tv;
    46       times(&ts);
    47       gettimeofday(&tv, 0);real_time=tv.tv_sec+double(tv.tv_usec)/1e6;
    48     }
    49   
    50     /// Constructor initializing with zero.
    51     TimeStamp()
    52     { ts.tms_utime=ts.tms_stime=ts.tms_cutime=ts.tms_cstime=0; real_time=0;}
    53     ///Constructor initializing with the current time values of the process.
    54     TimeStamp(void *) { stamp();}
    55   
    56     TimeStamp &operator+=(const TimeStamp &b)
    57     {
    58       ts.tms_utime+=b.ts.tms_utime;
    59       ts.tms_stime+=b.ts.tms_stime;
    60       ts.tms_cutime+=b.ts.tms_cutime;
    61       ts.tms_cstime+=b.ts.tms_cstime;
    62       real_time+=b.real_time;
    63       return *this;
    64     }
    65     TimeStamp operator+(const TimeStamp &b) const
    66     {
    67       TimeStamp t(*this);
    68       return t+=b;
    69     }
    70     TimeStamp &operator-=(const TimeStamp &b)
    71     {
    72       ts.tms_utime-=b.ts.tms_utime;
    73       ts.tms_stime-=b.ts.tms_stime;
    74       ts.tms_cutime-=b.ts.tms_cutime;
    75       ts.tms_cstime-=b.ts.tms_cstime;
    76       real_time-=b.real_time;
    77       return *this;
    78     }
    79     TimeStamp operator-(const TimeStamp &b) const
    80     {
    81       TimeStamp t(*this);
    82       return t-=b;
    83     }
    84 
    85     ///The time ellapsed since the last call of stamp()
    86     TimeStamp ellapsed() const
    87     {
    88       TimeStamp t(NULL);
    89       return t-*this;
    90     }
    91   
    92     friend std::ostream& operator<<(std::ostream& os,const TimeStamp &t);
    93   
    94     double getUserTime() const
    95     {
    96       return double(ts.tms_utime)/sysconf(_SC_CLK_TCK);
    97     }
    98     double getSystemTime() const
    99     {
   100       return double(ts.tms_stime)/sysconf(_SC_CLK_TCK);
   101     }
   102     double getCUserTime() const
   103     {
   104       return double(ts.tms_cutime)/sysconf(_SC_CLK_TCK);
   105     }
   106     double getCSystemTime() const
   107     {
   108       return double(ts.tms_cstime)/sysconf(_SC_CLK_TCK);
   109     }
   110   };
   111 
   112   ///Class measuring the cpu time and real time usage of the process.
   113   class Timer
   114   {
   115     TimeStamp start_time;
   116 
   117     void _reset() {start_time.stamp();}
   118   
   119   public: 
   120     ///Constructor. It starts with zero time counters.
   121     Timer() {_reset();}
   122 
   123     ///Computes the ellapsed time.
   124 
   125     ///This conversion computes the ellapsed time
   126     ///since the construction of \c t or since
   127     ///the last \c t.reset().
   128     operator TimeStamp ()
   129     {
   130       TimeStamp t;
   131       t.stamp();
   132       return t-start_time;
   133     }
   134 
   135     ///Resets the time counters.
   136     TimeStamp reset()
   137     {
   138       TimeStamp t(start_time);
   139       _reset();
   140       return start_time-t;
   141     }
   142   };
   143 
   144   ///Prints the time counters.
   145   inline std::ostream& operator<<(std::ostream& os,const TimeStamp &t)
   146   {
   147     long cls = sysconf(_SC_CLK_TCK);
   148     os << "u: " << double(t.getTms().tms_utime)/cls <<
   149       "s, s: " << double(t.getTms().tms_stime)/cls <<
   150       "s, cu: " << double(t.getTms().tms_cutime)/cls <<
   151       "s, cs: " << double(t.getTms().tms_cstime)/cls <<
   152       "s, real: " << t.getRealTime() << "s";
   153     return os;
   154   }
   155 
   156 } //namespace hugo
   157 
   158 #endif //HUGO_TIME_MEASURE_H