00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "TStopwatch.h"
00022 #include "TTimeStamp.h"
00023 #include "TString.h"
00024
00025 #if defined(R__UNIX)
00026 # include <sys/times.h>
00027 # include <unistd.h>
00028 static Double_t gTicks = 0;
00029 #elif defined(WIN32)
00030 # include "TError.h"
00031 const Double_t gTicks = 1.0e-7;
00032 # include "Windows4Root.h"
00033 #endif
00034
00035
00036 ClassImp(TStopwatch)
00037
00038
00039 TStopwatch::TStopwatch()
00040 {
00041
00042
00043 #ifdef R__UNIX
00044 if (gTicks <= 0.0)
00045 gTicks = (Double_t)sysconf(_SC_CLK_TCK);
00046 #endif
00047
00048 fStopRealTime = 0;
00049 fStopCpuTime = 0;
00050
00051 Start();
00052 }
00053
00054
00055 void TStopwatch::Start(Bool_t reset)
00056 {
00057
00058
00059
00060
00061
00062 if (reset) {
00063 fState = kUndefined;
00064 fTotalCpuTime = 0;
00065 fTotalRealTime = 0;
00066 fCounter = 0;
00067 }
00068 if (fState != kRunning) {
00069 fStartRealTime = GetRealTime();
00070 fStartCpuTime = GetCPUTime();
00071 }
00072 fState = kRunning;
00073 fCounter++;
00074 }
00075
00076
00077 void TStopwatch::Stop()
00078 {
00079
00080
00081 fStopRealTime = GetRealTime();
00082 fStopCpuTime = GetCPUTime();
00083
00084 if (fState == kRunning) {
00085 fTotalCpuTime += fStopCpuTime - fStartCpuTime;
00086 fTotalRealTime += fStopRealTime - fStartRealTime;
00087 }
00088 fState = kStopped;
00089 }
00090
00091
00092 void TStopwatch::Continue()
00093 {
00094
00095
00096
00097 if (fState == kUndefined)
00098 Error("Continue", "stopwatch not started");
00099
00100 if (fState == kStopped) {
00101 fTotalCpuTime -= fStopCpuTime - fStartCpuTime;
00102 fTotalRealTime -= fStopRealTime - fStartRealTime;
00103 }
00104
00105 fState = kRunning;
00106 }
00107
00108
00109 Double_t TStopwatch::RealTime()
00110 {
00111
00112
00113
00114 if (fState == kUndefined)
00115 Error("RealTime", "stopwatch not started");
00116
00117 if (fState == kRunning)
00118 Stop();
00119
00120 return fTotalRealTime;
00121 }
00122
00123
00124 Double_t TStopwatch::CpuTime()
00125 {
00126
00127
00128
00129 if (fState == kUndefined)
00130 Error("CpuTime", "stopwatch not started");
00131
00132 if (fState == kRunning)
00133 Stop();
00134
00135 return fTotalCpuTime;
00136 }
00137
00138
00139 Double_t TStopwatch::GetRealTime()
00140 {
00141
00142
00143 #if defined(R__UNIX)
00144 return TTimeStamp();
00145 #elif defined(WIN32)
00146 union {
00147 FILETIME ftFileTime;
00148 __int64 ftInt64;
00149 } ftRealTime;
00150 SYSTEMTIME st;
00151 GetSystemTime(&st);
00152 SystemTimeToFileTime(&st,&ftRealTime.ftFileTime);
00153 return (Double_t)ftRealTime.ftInt64 * gTicks;
00154 #endif
00155 }
00156
00157
00158 Double_t TStopwatch::GetCPUTime()
00159 {
00160
00161
00162 #if defined(R__UNIX)
00163 struct tms cpt;
00164 times(&cpt);
00165 return (Double_t)(cpt.tms_utime+cpt.tms_stime) / gTicks;
00166 #elif defined(WIN32)
00167
00168 OSVERSIONINFO OsVersionInfo;
00169
00170
00171
00172
00173
00174
00175
00176 OsVersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
00177 GetVersionEx(&OsVersionInfo);
00178 if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) {
00179 DWORD ret;
00180 FILETIME ftCreate,
00181 ftExit;
00182
00183 union {
00184 FILETIME ftFileTime;
00185 __int64 ftInt64;
00186 } ftKernel;
00187
00188 union {
00189 FILETIME ftFileTime;
00190 __int64 ftInt64;
00191 } ftUser;
00192
00193 HANDLE hThread = GetCurrentThread();
00194 ret = GetThreadTimes (hThread, &ftCreate, &ftExit,
00195 &ftKernel.ftFileTime,
00196 &ftUser.ftFileTime);
00197 if (ret != TRUE) {
00198 ret = GetLastError ();
00199 ::Error ("GetCPUTime", " Error on GetProcessTimes 0x%lx", (int)ret);
00200 }
00201
00202
00203
00204
00205
00206
00207
00208
00209 return (Double_t) (ftKernel.ftInt64 + ftUser.ftInt64) * gTicks;
00210 } else
00211 return GetRealTime();
00212 #endif
00213 }
00214
00215
00216 void TStopwatch::Print(Option_t *opt) const
00217 {
00218
00219
00220
00221
00222
00223 Double_t realt = const_cast<TStopwatch*>(this)->RealTime();
00224 Double_t cput = const_cast<TStopwatch*>(this)->CpuTime();
00225
00226 Int_t hours = Int_t(realt / 3600);
00227 realt -= hours * 3600;
00228 Int_t min = Int_t(realt / 60);
00229 realt -= min * 60;
00230 Int_t sec = Int_t(realt);
00231
00232 if (realt < 0) realt = 0;
00233 if (cput < 0) cput = 0;
00234
00235 if (opt && *opt == 'm') {
00236 if (Counter() > 1) {
00237 Printf("Real time %d:%02d:%06.3f, CP time %.3f, %d slices", hours, min, realt, cput, Counter());
00238 } else {
00239 Printf("Real time %d:%02d:%06.3f, CP time %.3f", hours, min, realt, cput);
00240 }
00241 } else if (opt && *opt == 'u') {
00242 if (Counter() > 1) {
00243 Printf("Real time %d:%02d:%09.6f, CP time %.3f, %d slices", hours, min, realt, cput, Counter());
00244 } else {
00245 Printf("Real time %d:%02d:%09.6f, CP time %.3f", hours, min, realt, cput);
00246 }
00247 } else {
00248 if (Counter() > 1) {
00249 Printf("Real time %d:%02d:%02d, CP time %.3f, %d slices", hours, min, sec, cput, Counter());
00250 } else {
00251 Printf("Real time %d:%02d:%02d, CP time %.3f", hours, min, sec, cput);
00252 }
00253 }
00254 }