src/work/marci/time_measure.h
author alpar
Mon, 23 Feb 2004 07:05:27 +0000
changeset 118 38e16c594a4f
parent 117 67253d52b284
child 121 9d5a99b282c0
permissions -rw-r--r--
Improvements in 'Timer'/'TimeStamp'
marci@73
     1
// -*- c++ -*-
marci@73
     2
#ifndef TIME_MEASURE_H
marci@73
     3
#define TIME_MEASURE_H
marci@73
     4
marci@73
     5
#include <sys/time.h>
alpar@117
     6
#include <sys/times.h>
alpar@117
     7
#include <fstream>
alpar@117
     8
#include <iostream>
marci@73
     9
marci@73
    10
double currTime() {
marci@73
    11
  timeval tv;
marci@73
    12
  //timezone tz;
marci@73
    13
  gettimeofday(&tv, 0);
marci@73
    14
  return double(tv.tv_sec)+double(tv.tv_usec)/1000000.0;
marci@73
    15
}
marci@73
    16
alpar@117
    17
class TimeStamp
alpar@117
    18
{
alpar@117
    19
  tms ts;
alpar@118
    20
  double real_time;
alpar@118
    21
  
alpar@117
    22
public:
alpar@117
    23
alpar@117
    24
  tms &getTms() {return ts;}
alpar@117
    25
  const tms &getTms() const {return ts;}
alpar@118
    26
  double getRealTime() const {return real_time;}
alpar@118
    27
  void stamp()
alpar@118
    28
  {
alpar@118
    29
    timeval tv;
alpar@118
    30
    times(&ts);
alpar@118
    31
    gettimeofday(&tv, 0);real_time=tv.tv_sec+double(tv.tv_usec)/1e6;
alpar@118
    32
  }
alpar@118
    33
  
alpar@118
    34
  TimeStamp()
alpar@118
    35
  { ts.tms_utime=ts.tms_stime=ts.tms_cutime=ts.tms_cstime=0; real_time=0;}
alpar@118
    36
  
alpar@117
    37
  TimeStamp(void *) { stamp();}
alpar@117
    38
  
alpar@117
    39
  TimeStamp &operator+=(const TimeStamp &b)
alpar@117
    40
  {
alpar@117
    41
    ts.tms_utime+=b.ts.tms_utime;
alpar@117
    42
    ts.tms_stime+=b.ts.tms_stime;
alpar@117
    43
    ts.tms_cutime+=b.ts.tms_cutime;
alpar@117
    44
    ts.tms_cstime+=b.ts.tms_cstime;
alpar@118
    45
    real_time+=b.real_time;
alpar@117
    46
    return *this;
alpar@117
    47
  }
alpar@117
    48
  TimeStamp operator+(const TimeStamp &b) const
alpar@117
    49
  {
alpar@117
    50
    TimeStamp t(*this);
alpar@117
    51
    return t+=b;
alpar@117
    52
  }
alpar@117
    53
  TimeStamp &operator-=(const TimeStamp &b)
alpar@117
    54
  {
alpar@117
    55
    ts.tms_utime-=b.ts.tms_utime;
alpar@117
    56
    ts.tms_stime-=b.ts.tms_stime;
alpar@117
    57
    ts.tms_cutime-=b.ts.tms_cutime;
alpar@117
    58
    ts.tms_cstime-=b.ts.tms_cstime;
alpar@118
    59
    real_time-=b.real_time;
alpar@117
    60
    return *this;
alpar@117
    61
  }
alpar@117
    62
  TimeStamp operator-(const TimeStamp &b) const
alpar@117
    63
  {
alpar@117
    64
    TimeStamp t(*this);
alpar@117
    65
    return t-=b;
alpar@117
    66
  }
alpar@117
    67
alpar@117
    68
  TimeStamp Ellapsed() const
alpar@117
    69
  {
alpar@117
    70
    TimeStamp t(NULL);
alpar@117
    71
    return t-*this;
alpar@117
    72
  }
alpar@117
    73
  
alpar@117
    74
  friend std::ostream& operator<<(std::ostream& os,const TimeStamp &t);
alpar@117
    75
  
alpar@118
    76
  double getUserTime() const
alpar@118
    77
  {
alpar@118
    78
    long cls = sysconf(_SC_CLK_TCK);
alpar@118
    79
    return double(ts.tms_utime)/cls;
alpar@118
    80
  }
alpar@118
    81
  double getSystemTime() const
alpar@118
    82
  {
alpar@118
    83
    long cls = sysconf(_SC_CLK_TCK);
alpar@118
    84
    return double(ts.tms_stime)/cls;
alpar@118
    85
  }
alpar@118
    86
  double getCUserTime() const
alpar@118
    87
  {
alpar@118
    88
    long cls = sysconf(_SC_CLK_TCK);
alpar@118
    89
    return double(ts.tms_cutime)/cls;
alpar@118
    90
  }
alpar@118
    91
  double getCSystemTime() const
alpar@118
    92
  {
alpar@118
    93
    long cls = sysconf(_SC_CLK_TCK);
alpar@118
    94
    return double(ts.tms_cstime)/cls;
alpar@118
    95
  }
alpar@117
    96
};
alpar@117
    97
alpar@117
    98
class Timer
alpar@117
    99
{
alpar@117
   100
  TimeStamp start_time;
alpar@117
   101
alpar@117
   102
public: 
alpar@117
   103
  void reset() {start_time.stamp();}
alpar@117
   104
  Timer() {reset();}
alpar@117
   105
alpar@117
   106
  operator TimeStamp ()
alpar@117
   107
  {
alpar@117
   108
    TimeStamp t;
alpar@117
   109
    t.stamp();
alpar@117
   110
    return t-start_time;
alpar@117
   111
  }  
alpar@117
   112
};
alpar@117
   113
alpar@117
   114
inline std::ostream& operator<<(std::ostream& os,const TimeStamp &t)
alpar@117
   115
{
alpar@117
   116
  long cls = sysconf(_SC_CLK_TCK);
alpar@118
   117
  os << "u: " << double(t.getTms().tms_utime)/cls <<
alpar@117
   118
    "s, s: " << double(t.getTms().tms_stime)/cls <<
alpar@117
   119
    "s, cu: " << double(t.getTms().tms_cutime)/cls <<
alpar@118
   120
    "s, cs: " << double(t.getTms().tms_cstime)/cls <<
alpar@118
   121
    "s, real: " << t.getRealTime() << "s";
alpar@117
   122
  return os;
alpar@117
   123
}
alpar@117
   124
marci@73
   125
#endif //TIME_MEASURE_H