00001 /* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ 00002 00035 #ifndef __TIMER_H 00036 #define __TIMER_H 00037 00038 #include <iostream> 00039 #include <string> 00040 00041 00043 class BaseTimer { 00044 public: 00045 enum { 00046 MSPSEC = 1000000 00047 }; 00048 00050 inline void clear() { _t = 0; } 00051 00053 inline double time() const { return _t; } 00054 00056 static long seed(); 00057 00059 std::ostream &print (std::ostream &) const; 00060 00063 // -- Some arithmetic operators to compute cumulative time : 00064 BaseTimer& operator = (const BaseTimer & T) ; 00065 const BaseTimer operator - (const BaseTimer & T) const; 00066 const BaseTimer operator - () ; 00067 const BaseTimer operator + (const BaseTimer & T) const; 00068 BaseTimer& operator += (const BaseTimer & T) { return *this = *this + T; }; 00069 BaseTimer& operator -= (const BaseTimer & T) { return *this = *this - T; }; 00072 public: 00073 double _start_t; 00074 double _t; 00075 }; 00076 00077 inline std::ostream &operator << (std::ostream &o, const BaseTimer &BT) 00078 { return BT.print(o); } 00079 00080 class RealTimer : public BaseTimer { 00081 public: 00082 inline RealTimer (const BaseTimer &BT) : BaseTimer (BT) {}; 00083 inline RealTimer () {}; 00084 void start (); 00085 void stop (); 00086 }; 00087 00088 00089 class UserTimer : public BaseTimer { 00090 public: 00091 inline UserTimer (const BaseTimer &BT) : BaseTimer (BT) {}; 00092 inline UserTimer () {}; 00093 void start (); 00094 void stop (); 00095 }; 00096 00097 00098 class SysTimer : public BaseTimer { 00099 public: 00100 inline SysTimer (const BaseTimer &BT): BaseTimer (BT) {}; 00101 inline SysTimer () {}; 00102 void start (); 00103 void stop (); 00104 }; 00105 00107 class Timer { 00108 public : 00109 00111 void clear(); 00112 00114 void start (); 00115 00117 void stop (); 00118 00120 double usertime () const { return ut.time(); } 00121 00123 double systime () const { return st.time(); } 00124 00126 double realtime () const { return rt.time(); } 00127 00128 // retourne une petite graine 00129 // long seed() const { return RealTimer::seed(); } 00132 // Some arithmetic operators to compute cumulative time : 00133 Timer& operator = (const Timer & T) ; 00134 const Timer operator - (const Timer & T) const; 00135 const Timer operator - () ; 00136 const Timer operator + (const Timer & T) const; 00137 Timer& operator += (const Timer & T) { return *this = *this + T; }; 00138 Timer& operator -= (const Timer & T) { return *this = *this - T; }; 00140 // -- methods : 00141 std::ostream &print (std::ostream &) const; 00142 00143 size_t count() const {return _count;} 00144 00145 private: 00146 size_t _count; // how many 00147 00148 RealTimer rt; 00149 UserTimer ut; 00150 SysTimer st; 00151 }; 00152 00153 // inline std::ostream &operator << (std::ostream &o, const Timer &T) 00154 // { return T.print (o); } 00155 00156 inline std::ostream &operator << (std::ostream &o, const Timer &T) 00157 { 00158 double ut = T.usertime(); 00159 if (ut < 0.0000000001) ut = 0; 00160 return o << T.realtime() << "s (" << ut << " cpu) [" << T.count() << "]"; } 00161 00162 00163 00164 00165 inline void outputTimerInfoEx(std::ostream & os, Timer &tim, std::string ostring) 00166 { 00167 os << ostring << " : " << tim.usertime() << " sec." << std::endl; 00168 } 00169 00170 00171 00172 00173 //#include "timer.C" 00174 00175 #endif
1.5.6