src/work/marci/time_measure.h
author alpar
Mon, 26 Apr 2004 17:33:51 +0000
changeset 425 4fbe868c1fb4
parent 327 63c138adc477
permissions -rw-r--r--
Some more docs.
Put it into the 'misc' group.
marci@73
     1
// -*- c++ -*-
marci@259
     2
#ifndef HUGO_TIME_MEASURE_H
marci@259
     3
#define HUGO_TIME_MEASURE_H
marci@73
     4
alpar@425
     5
///ingroup graphs
alpar@425
     6
///\file
alpar@425
     7
///\brief Tools for measuring cpu usage
alpar@425
     8
marci@73
     9
#include <sys/time.h>
alpar@117
    10
#include <sys/times.h>
alpar@117
    11
#include <fstream>
alpar@117
    12
#include <iostream>
jacint@121
    13
#include <unistd.h>
marci@73
    14
marci@323
    15
namespace hugo {
marci@73
    16
alpar@425
    17
  /// \addtogroup misc
alpar@425
    18
  /// @{
marci@323
    19
alpar@425
    20
  /// A class to store (cpu)time instances.
alpar@327
    21
alpar@327
    22
  /// This class stores five time values.
alpar@327
    23
  /// - a real time
alpar@327
    24
  /// - a user cpu time
alpar@327
    25
  /// - a system cpu time
alpar@327
    26
  /// - a user cpu time of children
alpar@327
    27
  /// - a system cpu time of children
alpar@327
    28
  ///
alpar@327
    29
  /// TimeStamp's can be added to or substracted from each other and
alpar@425
    30
  /// they can be pushed to a stream.
alpar@327
    31
marci@323
    32
  class TimeStamp
marci@323
    33
  {
marci@323
    34
    tms ts;
marci@323
    35
    double real_time;
alpar@118
    36
  
marci@323
    37
  public:
alpar@117
    38
marci@323
    39
    tms &getTms() {return ts;}
marci@323
    40
    const tms &getTms() const {return ts;}
alpar@425
    41
    ///Read the current time values of the process
marci@323
    42
    void stamp()
marci@323
    43
    {
marci@323
    44
      timeval tv;
marci@323
    45
      times(&ts);
marci@323
    46
      gettimeofday(&tv, 0);real_time=tv.tv_sec+double(tv.tv_usec)/1e6;
marci@323
    47
    }
marci@323
    48
  
alpar@425
    49
    /// Constructor initializing with zero
marci@323
    50
    TimeStamp()
marci@323
    51
    { ts.tms_utime=ts.tms_stime=ts.tms_cutime=ts.tms_cstime=0; real_time=0;}
alpar@425
    52
    ///Constructor initializing with the current time values of the process
marci@323
    53
    TimeStamp(void *) { stamp();}
marci@323
    54
  
alpar@425
    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
    }
alpar@425
    65
    ///
marci@323
    66
    TimeStamp operator+(const TimeStamp &b) const
marci@323
    67
    {
marci@323
    68
      TimeStamp t(*this);
marci@323
    69
      return t+=b;
marci@323
    70
    }
alpar@425
    71
    ///
marci@323
    72
    TimeStamp &operator-=(const TimeStamp &b)
marci@323
    73
    {
marci@323
    74
      ts.tms_utime-=b.ts.tms_utime;
marci@323
    75
      ts.tms_stime-=b.ts.tms_stime;
marci@323
    76
      ts.tms_cutime-=b.ts.tms_cutime;
marci@323
    77
      ts.tms_cstime-=b.ts.tms_cstime;
marci@323
    78
      real_time-=b.real_time;
marci@323
    79
      return *this;
marci@323
    80
    }
alpar@425
    81
    ///
marci@323
    82
    TimeStamp operator-(const TimeStamp &b) const
marci@323
    83
    {
marci@323
    84
      TimeStamp t(*this);
marci@323
    85
      return t-=b;
marci@323
    86
    }
marci@323
    87
alpar@327
    88
    ///The time ellapsed since the last call of stamp()
alpar@324
    89
    TimeStamp ellapsed() const
marci@323
    90
    {
marci@323
    91
      TimeStamp t(NULL);
marci@323
    92
      return t-*this;
marci@323
    93
    }
marci@323
    94
  
marci@323
    95
    friend std::ostream& operator<<(std::ostream& os,const TimeStamp &t);
marci@323
    96
  
alpar@425
    97
    ///Gives back the user time of the process
marci@323
    98
    double getUserTime() const
marci@323
    99
    {
marci@323
   100
      return double(ts.tms_utime)/sysconf(_SC_CLK_TCK);
marci@323
   101
    }
alpar@425
   102
    ///Gives back the system time of the process
marci@323
   103
    double getSystemTime() const
marci@323
   104
    {
marci@323
   105
      return double(ts.tms_stime)/sysconf(_SC_CLK_TCK);
marci@323
   106
    }
alpar@425
   107
    ///Gives back the user time of the process' children
marci@323
   108
    double getCUserTime() const
marci@323
   109
    {
marci@323
   110
      return double(ts.tms_cutime)/sysconf(_SC_CLK_TCK);
marci@323
   111
    }
alpar@425
   112
    ///Gives back the user time of the process' children
marci@323
   113
    double getCSystemTime() const
marci@323
   114
    {
marci@323
   115
      return double(ts.tms_cstime)/sysconf(_SC_CLK_TCK);
marci@323
   116
    }
alpar@425
   117
    ///Gives back the real time of the process
alpar@425
   118
    double getRealTime() const {return real_time;}
marci@323
   119
  };
marci@323
   120
alpar@425
   121
  ///Class measuring the cpu time and real time usage of the process
marci@323
   122
  class Timer
alpar@118
   123
  {
marci@323
   124
    TimeStamp start_time;
marci@323
   125
marci@323
   126
    void _reset() {start_time.stamp();}
alpar@118
   127
  
marci@323
   128
  public: 
alpar@425
   129
    ///Constructor. It starts with zero time counters
marci@323
   130
    Timer() {_reset();}
marci@323
   131
alpar@425
   132
    ///Computes the ellapsed time
alpar@327
   133
alpar@327
   134
    ///This conversion computes the ellapsed time
alpar@327
   135
    ///since the construction of \c t or since
alpar@327
   136
    ///the last \c t.reset().
marci@323
   137
    operator TimeStamp ()
marci@323
   138
    {
marci@323
   139
      TimeStamp t;
marci@323
   140
      t.stamp();
marci@323
   141
      return t-start_time;
marci@323
   142
    }
marci@323
   143
alpar@425
   144
    ///Resets the time counters
marci@323
   145
    TimeStamp reset()
marci@323
   146
    {
marci@323
   147
      TimeStamp t(start_time);
marci@323
   148
      _reset();
marci@323
   149
      return start_time-t;
marci@323
   150
    }
marci@323
   151
  };
marci@323
   152
alpar@425
   153
  ///Prints the time counters
alpar@425
   154
alpar@425
   155
  ///Prints the time counters in the folloing form:
alpar@425
   156
  ///
alpar@425
   157
  /// u: XX.XXs s: XX.XXs cu: XX.XXs cs: XX.XXs real: XX.XXs 
alpar@425
   158
  ///
alpar@425
   159
  /// where the values are the
alpar@425
   160
  /// - a user cpu time,
alpar@425
   161
  /// - a system cpu time,
alpar@425
   162
  /// - a user cpu time of children,
alpar@425
   163
  /// - a system cpu time of children and
alpar@425
   164
  /// - a real time,
alpar@425
   165
  ///
alpar@425
   166
  ///respectively
marci@323
   167
  inline std::ostream& operator<<(std::ostream& os,const TimeStamp &t)
alpar@117
   168
  {
marci@323
   169
    long cls = sysconf(_SC_CLK_TCK);
marci@323
   170
    os << "u: " << double(t.getTms().tms_utime)/cls <<
marci@323
   171
      "s, s: " << double(t.getTms().tms_stime)/cls <<
marci@323
   172
      "s, cu: " << double(t.getTms().tms_cutime)/cls <<
marci@323
   173
      "s, cs: " << double(t.getTms().tms_cstime)/cls <<
marci@323
   174
      "s, real: " << t.getRealTime() << "s";
marci@323
   175
    return os;
alpar@117
   176
  }
alpar@117
   177
alpar@425
   178
  /// @}  
alpar@425
   179
marci@323
   180
} //namespace hugo
alpar@117
   181
marci@259
   182
#endif //HUGO_TIME_MEASURE_H