00001 /* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ 00002 00029 #ifndef __LINBOX__TIMER__C__ 00030 #define __LINBOX__TIMER__C__ 00031 // Description: 00032 // - various timer objects 00033 // - to be rewritten to be more efficient 00034 00035 #include <cmath> 00036 00037 extern "C" { 00038 # include <sys/time.h> 00039 # include <sys/resource.h> 00040 // int getrusage (int, struct rusage*) ; 00041 } 00042 00043 #include <iostream> 00044 00045 #include "timer.h" 00046 00048 long BaseTimer::seed() 00049 { 00050 struct timeval tp; 00051 gettimeofday(&tp, 0) ; 00052 return(tp.tv_usec); 00053 } 00054 00056 std::ostream& BaseTimer::print( std::ostream& o ) const 00057 { return o << _t ; } 00058 00060 BaseTimer& BaseTimer::operator = (const BaseTimer & T) 00061 { 00062 _t = T._t ; 00063 return *this ; 00064 } 00065 00067 const BaseTimer BaseTimer::operator - (const BaseTimer & T) const 00068 { 00069 BaseTimer Tmp ; 00070 Tmp._t = _t - T._t ; 00071 return Tmp ; 00072 } 00073 00074 const BaseTimer BaseTimer::operator - () 00075 { 00076 BaseTimer Tmp ; 00077 Tmp._t = -_t ; 00078 return Tmp ; 00079 } 00080 00081 const BaseTimer BaseTimer::operator + (const BaseTimer & T) const 00082 { 00083 BaseTimer Tmp ; 00084 Tmp._t = _t + T._t ; 00085 return Tmp ; 00086 } 00087 00089 void RealTimer::start() 00090 { 00091 struct timeval tmp2 ; 00092 gettimeofday (&tmp2, 0) ; 00093 00094 // real time 00095 _start_t = (double) tmp2.tv_sec + 00096 ((double) tmp2.tv_usec)/ (double)BaseTimer::MSPSEC ; 00097 } 00098 00099 00101 void RealTimer::stop() 00102 { 00103 struct timeval tmp2 ; 00104 gettimeofday (&tmp2, 0) ; 00105 00106 // real time 00107 _t = (double) tmp2.tv_sec + 00108 ((double) tmp2.tv_usec)/ (double)BaseTimer::MSPSEC - _start_t ; 00109 } 00110 00112 void UserTimer::start() 00113 { 00114 struct rusage tmp1 ; // to getrusage (sys+user times) 00115 getrusage (RUSAGE_SELF, &tmp1) ; 00116 // user time 00117 _start_t = (double) tmp1.ru_utime.tv_sec + 00118 ((double) tmp1.ru_utime.tv_usec)/ (double)MSPSEC ; 00119 } 00120 00121 00123 void UserTimer::stop() 00124 { 00125 struct rusage tmp1 ; // to getrusage (sys+user times) 00126 getrusage (RUSAGE_SELF, &tmp1) ; 00127 // user time 00128 _t = (double) tmp1.ru_utime.tv_sec + 00129 ((double) tmp1.ru_utime.tv_usec)/ (double)MSPSEC - _start_t ; 00130 } 00131 00132 00134 void SysTimer::start() 00135 { 00136 struct rusage tmp1 ; // to getrusage (sys+user times) 00137 getrusage (RUSAGE_SELF, &tmp1) ; 00138 // user time 00139 _start_t = (double) tmp1.ru_stime.tv_sec + 00140 ((double) tmp1.ru_stime.tv_usec)/ (double)MSPSEC ; 00141 } 00142 00143 00145 void SysTimer::stop() 00146 { 00147 struct rusage tmp1 ; // to getrusage (sys+user times) 00148 getrusage (RUSAGE_SELF, &tmp1) ; 00149 // user time 00150 _t = (double) tmp1.ru_stime.tv_sec + 00151 ((double) tmp1.ru_stime.tv_usec)/ (double)MSPSEC - _start_t ; 00152 } 00153 00154 00155 00157 void Timer::clear() 00158 { rt.clear() ; ut.clear(); st.clear(); _count = 0; } 00159 00161 void Timer::start() 00162 { rt.start() ; ut.start(); st.start(); _count = 0; } 00163 00165 void Timer::stop() 00166 { rt.stop() ; ut.stop(); st.stop(); _count = 1; } 00167 00168 00169 std::ostream& Timer::print( std::ostream& o ) const 00170 { 00171 o << "user time: " << usertime() << '\n' ; 00172 o << "sys. time: " << systime() << '\n' ; 00173 return o << "real time: " << realtime() << std::endl ; 00174 } 00175 00177 Timer& Timer::operator = (const Timer & T) 00178 { 00179 ut = T.ut ; 00180 st = T.st ; 00181 rt = T.rt ; 00182 _count = T._count; 00183 return *this ; 00184 } 00185 00187 const Timer Timer::operator - (const Timer & T) const 00188 { 00189 Timer Tmp ; 00190 Tmp.ut = ut - T.ut ; 00191 Tmp.st = st - T.st ; 00192 Tmp.rt = rt - T.rt ; 00193 Tmp._count = _count - T._count; 00194 return Tmp ; 00195 } 00196 00197 const Timer Timer::operator - () 00198 { 00199 Timer Tmp ; 00200 Tmp.ut = -ut ; 00201 Tmp.st = -st ; 00202 Tmp.rt = -rt ; 00203 Tmp._count = - _count; 00204 return Tmp ; 00205 } 00206 00207 const Timer Timer::operator + (const Timer & T) const 00208 { 00209 Timer Tmp ; 00210 Tmp.ut = ut + T.ut ; 00211 Tmp.st = st + T.st ; 00212 Tmp.rt = rt + T.rt ; 00213 Tmp._count = _count + T._count; 00214 return Tmp ; 00215 } 00216 00217 00218 #endif
1.5.6