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