1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/lemon/time_measure.h Mon May 23 04:48:14 2005 +0000
1.3 @@ -0,0 +1,255 @@
1.4 +/* -*- C++ -*-
1.5 + * lemon/time_measure.h - Part of LEMON, a generic C++ optimization library
1.6 + *
1.7 + * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
1.8 + * (Egervary Research Group on Combinatorial Optimization, EGRES).
1.9 + *
1.10 + * Permission to use, modify and distribute this software is granted
1.11 + * provided that this copyright notice appears in all copies. For
1.12 + * precise terms see the accompanying LICENSE file.
1.13 + *
1.14 + * This software is provided "AS IS" with no warranty of any kind,
1.15 + * express or implied, and with no claim as to its suitability for any
1.16 + * purpose.
1.17 + *
1.18 + */
1.19 +
1.20 +#ifndef LEMON_TIME_MEASURE_H
1.21 +#define LEMON_TIME_MEASURE_H
1.22 +
1.23 +///\ingroup misc
1.24 +///\file
1.25 +///\brief Tools for measuring cpu usage
1.26 +
1.27 +#include <sys/time.h>
1.28 +#include <sys/times.h>
1.29 +#include <fstream>
1.30 +#include <iostream>
1.31 +#include <unistd.h>
1.32 +
1.33 +namespace lemon {
1.34 +
1.35 + /// \addtogroup misc
1.36 + /// @{
1.37 +
1.38 + /// A class to store (cpu)time instances.
1.39 +
1.40 + /// This class stores five time values.
1.41 + /// - a real time
1.42 + /// - a user cpu time
1.43 + /// - a system cpu time
1.44 + /// - a user cpu time of children
1.45 + /// - a system cpu time of children
1.46 + ///
1.47 + /// TimeStamp's can be added to or substracted from each other and
1.48 + /// they can be pushed to a stream.
1.49 + ///
1.50 + /// In most cases, perhaps \ref Timer class is what you want to use instead.
1.51 + ///
1.52 + ///\author Alpar Juttner
1.53 +
1.54 + class TimeStamp
1.55 + {
1.56 + tms ts;
1.57 + double real_time;
1.58 +
1.59 + public:
1.60 +
1.61 + tms &getTms() {return ts;}
1.62 + const tms &getTms() const {return ts;}
1.63 + ///Read the current time values of the process
1.64 + void stamp()
1.65 + {
1.66 + timeval tv;
1.67 + times(&ts);
1.68 + gettimeofday(&tv, 0);real_time=tv.tv_sec+double(tv.tv_usec)/1e6;
1.69 + }
1.70 +
1.71 + /// Constructor initializing with zero
1.72 + TimeStamp()
1.73 + { ts.tms_utime=ts.tms_stime=ts.tms_cutime=ts.tms_cstime=0; real_time=0;}
1.74 + ///Constructor initializing with the current time values of the process
1.75 + TimeStamp(void *) { stamp();}
1.76 +
1.77 + ///\e
1.78 + TimeStamp &operator+=(const TimeStamp &b)
1.79 + {
1.80 + ts.tms_utime+=b.ts.tms_utime;
1.81 + ts.tms_stime+=b.ts.tms_stime;
1.82 + ts.tms_cutime+=b.ts.tms_cutime;
1.83 + ts.tms_cstime+=b.ts.tms_cstime;
1.84 + real_time+=b.real_time;
1.85 + return *this;
1.86 + }
1.87 + ///\e
1.88 + TimeStamp operator+(const TimeStamp &b) const
1.89 + {
1.90 + TimeStamp t(*this);
1.91 + return t+=b;
1.92 + }
1.93 + ///\e
1.94 + TimeStamp &operator-=(const TimeStamp &b)
1.95 + {
1.96 + ts.tms_utime-=b.ts.tms_utime;
1.97 + ts.tms_stime-=b.ts.tms_stime;
1.98 + ts.tms_cutime-=b.ts.tms_cutime;
1.99 + ts.tms_cstime-=b.ts.tms_cstime;
1.100 + real_time-=b.real_time;
1.101 + return *this;
1.102 + }
1.103 + ///\e
1.104 + TimeStamp operator-(const TimeStamp &b) const
1.105 + {
1.106 + TimeStamp t(*this);
1.107 + return t-=b;
1.108 + }
1.109 + ///The time ellapsed since the last call of stamp()
1.110 + TimeStamp ellapsed() const
1.111 + {
1.112 + TimeStamp t(NULL);
1.113 + return t-*this;
1.114 + }
1.115 +
1.116 + friend std::ostream& operator<<(std::ostream& os,const TimeStamp &t);
1.117 +
1.118 + ///Gives back the user time of the process
1.119 + double getUserTime() const
1.120 + {
1.121 + return double(ts.tms_utime)/sysconf(_SC_CLK_TCK);
1.122 + }
1.123 + ///Gives back the system time of the process
1.124 + double getSystemTime() const
1.125 + {
1.126 + return double(ts.tms_stime)/sysconf(_SC_CLK_TCK);
1.127 + }
1.128 + ///Gives back the user time of the process' children
1.129 + double getCUserTime() const
1.130 + {
1.131 + return double(ts.tms_cutime)/sysconf(_SC_CLK_TCK);
1.132 + }
1.133 + ///Gives back the user time of the process' children
1.134 + double getCSystemTime() const
1.135 + {
1.136 + return double(ts.tms_cstime)/sysconf(_SC_CLK_TCK);
1.137 + }
1.138 + ///Gives back the real time of the process
1.139 + double getRealTime() const {return real_time;}
1.140 + };
1.141 +
1.142 + ///Class measuring the cpu time and real time usage of the process
1.143 +
1.144 + ///Class measuring the cpu time and real time usage of the process.
1.145 + ///It is quite easy-to-use, here is a short example.
1.146 + ///\code
1.147 + ///#include<lemon/time_measure.h>
1.148 + ///#include<iostream>
1.149 + ///
1.150 + ///int main()
1.151 + ///{
1.152 + ///
1.153 + /// ...
1.154 + ///
1.155 + /// Timer T;
1.156 + /// doSomething();
1.157 + /// std::cout << T << '\n';
1.158 + /// T.reset();
1.159 + /// doSomethingElse();
1.160 + /// std::cout << T << '\n';
1.161 + ///
1.162 + /// ...
1.163 + ///
1.164 + ///}
1.165 + ///\endcode
1.166 + ///
1.167 + ///\todo This shouldn't be Unix (Linux) specific.
1.168 + ///
1.169 + ///\author Alpar Juttner
1.170 + class Timer
1.171 + {
1.172 + TimeStamp start_time;
1.173 +
1.174 + void _reset() {start_time.stamp();}
1.175 +
1.176 + public:
1.177 + ///Constructor. It starts with zero time counters
1.178 + Timer() {_reset();}
1.179 +
1.180 + ///Computes the ellapsed time
1.181 +
1.182 + ///This conversion computes the ellapsed time
1.183 + ///since the construction of \c t or since
1.184 + ///the last \c t.reset().
1.185 + operator TimeStamp () const
1.186 + {
1.187 + TimeStamp t;
1.188 + t.stamp();
1.189 + return t-start_time;
1.190 + }
1.191 +
1.192 + ///Resets the time counters
1.193 +
1.194 + ///Resets the time counters
1.195 + ///
1.196 + void reset()
1.197 + {
1.198 + _reset();
1.199 + }
1.200 +
1.201 +
1.202 + ///Gives back the ellapsed user time of the process
1.203 + double getUserTime() const
1.204 + {
1.205 + return operator TimeStamp().getUserTime();
1.206 + }
1.207 + ///Gives back the ellapsed system time of the process
1.208 + double getSystemTime() const
1.209 + {
1.210 + return operator TimeStamp().getSystemTime();
1.211 + }
1.212 + ///Gives back the ellapsed user time of the process' children
1.213 + double getCUserTime() const
1.214 + {
1.215 + return operator TimeStamp().getCUserTime();
1.216 + }
1.217 + ///Gives back the ellapsed user time of the process' children
1.218 + double getCSystemTime() const
1.219 + {
1.220 + return operator TimeStamp().getCSystemTime();
1.221 + }
1.222 + ///Gives back the ellapsed real time of the process
1.223 + double getRealTime() const
1.224 + {
1.225 + return operator TimeStamp().getRealTime();
1.226 + }
1.227 +
1.228 + };
1.229 +
1.230 + ///Prints the time counters
1.231 +
1.232 + ///Prints the time counters in the following form:
1.233 + ///
1.234 + /// <tt>u: XX.XXs s: XX.XXs cu: XX.XXs cs: XX.XXs real: XX.XXs</tt>
1.235 + ///
1.236 + /// where the values are the
1.237 + /// \li \c u: user cpu time,
1.238 + /// \li \c s: system cpu time,
1.239 + /// \li \c cu: user cpu time of children,
1.240 + /// \li \c cs: system cpu time of children,
1.241 + /// \li \c real: real time.
1.242 + /// \relates TimeStamp
1.243 + inline std::ostream& operator<<(std::ostream& os,const TimeStamp &t)
1.244 + {
1.245 + long cls = sysconf(_SC_CLK_TCK);
1.246 + os << "u: " << double(t.getTms().tms_utime)/cls <<
1.247 + "s, s: " << double(t.getTms().tms_stime)/cls <<
1.248 + "s, cu: " << double(t.getTms().tms_cutime)/cls <<
1.249 + "s, cs: " << double(t.getTms().tms_cstime)/cls <<
1.250 + "s, real: " << t.getRealTime() << "s";
1.251 + return os;
1.252 + }
1.253 +
1.254 + /// @}
1.255 +
1.256 +} //namespace lemon
1.257 +
1.258 +#endif //LEMON_TIME_MEASURE_H