00001
00002
00003
00004
00005
00006
00007 #include "String.h"
00008 #include <iostream>
00009 #include <iomanip>
00010
00011 #include "Timer.h"
00012 #include "Destroyer.h"
00013
00014
00015 #ifdef TIMER
00016 Timer * Timer::s_instance = 0;
00017 DestroyerDeclare(Timer)
00018
00019 void Timer::reportTimes()
00020 {
00021 Timer * t = globalTimer();
00022 t->pause();
00023 std::cout << *t;
00024 t->cont();
00025 }
00026 #endif
00027
00028 Timer::Timer(String const & name, State initialState)
00029 : state(initialState),
00030 time_now(),
00031 resource_usage(),
00032 label(),
00033 time_start(0.0),
00034 cpu_start(0.0),
00035 user_cpu_start(0.0),
00036 system_cpu_start(0.0),
00037 max_memory_start(0),
00038 shared_memory_start(0),
00039 unshared_data_memory_start(0),
00040 unshared_stack_memory_start(0),
00041 page_faults_start(0),
00042 major_page_faults_start(0),
00043 minor_page_faults_start(0),
00044 blocked_input_ops_start(0),
00045 blocked_output_ops_start(0),
00046 time_accum(0.0),
00047 cpu_accum(0.0),
00048 user_cpu_accum(0.0),
00049 system_cpu_accum(0.0),
00050 max_memory_accum(0),
00051 shared_memory_accum(0),
00052 unshared_data_memory_accum(0),
00053 unshared_stack_memory_accum(0),
00054 page_faults_accum(0),
00055 minor_page_faults_accum(0),
00056 major_page_faults_accum(0),
00057 blocked_input_ops_accum(0),
00058 blocked_output_ops_accum(0)
00059 {
00060 reset(name, initialState);
00061 }
00062
00063 Timer::~Timer()
00064 {
00065 }
00066
00067 String const & Timer::name() const
00068 {
00069 return label;
00070 }
00071
00072 void Timer::reset(String const & name, State newState)
00073 {
00074 label = name;
00075 state = newState;
00076 if (newState != Paused)
00077 start();
00078 time_accum = cpu_accum = user_cpu_accum = system_cpu_accum = 0.0;
00079 max_memory_accum = shared_memory_accum = 0;
00080 unshared_data_memory_accum = unshared_stack_memory_accum = 0;
00081 page_faults_accum = minor_page_faults_accum = major_page_faults_accum = 0;
00082 blocked_input_ops_accum = blocked_output_ops_accum = 0;
00083 }
00084
00085 double Timer::elapsed(bool timeCalled)
00086 {
00087 double t = time_accum;
00088 if (state == Running)
00089 {
00090 if (!timeCalled)
00091 updateTime();
00092 t += currentElapsed() - time_start;
00093 }
00094
00095 return t;
00096 }
00097
00098 double Timer::cpu(bool usageCalled)
00099 {
00100 double t = cpu_accum;
00101 if (state == Running)
00102 {
00103 if (!usageCalled)
00104 updateResourceUsage();
00105 t += currentCpu() - cpu_start;
00106 }
00107
00108 return t;
00109 }
00110
00111 double Timer::user_cpu(bool usageCalled)
00112 {
00113 double t = user_cpu_accum;
00114 if (state == Running)
00115 {
00116 if (!usageCalled)
00117 updateResourceUsage();
00118 t += currentUserCpu() - user_cpu_start;
00119 }
00120
00121 return t;
00122 }
00123
00124 double Timer::system_cpu(bool usageCalled)
00125 {
00126 double t = system_cpu_accum;
00127 if (state == Running)
00128 {
00129 if (!usageCalled)
00130 updateResourceUsage();
00131 t += currentSystemCpu() - system_cpu_start;
00132 }
00133
00134 return t;
00135 }
00136
00137 long int Timer::max_memory(bool usageCalled)
00138 {
00139 long t = max_memory_accum;
00140 if (state == Running)
00141 {
00142 if (!usageCalled)
00143 updateResourceUsage();
00144 t += currentMaxMemory() - max_memory_start;
00145 }
00146
00147 return t;
00148 }
00149
00150 long int Timer::shared_memory(bool usageCalled)
00151 {
00152 long t = shared_memory_accum;
00153 if (state == Running)
00154 {
00155 if (!usageCalled)
00156 updateResourceUsage();
00157 t += currentSharedMemory() - shared_memory_start;
00158 }
00159
00160 return t;
00161 }
00162
00163 long int Timer::unshared_data_memory(bool usageCalled)
00164 {
00165 long t = unshared_data_memory_accum;
00166 if (state == Running)
00167 {
00168 if (!usageCalled)
00169 updateResourceUsage();
00170 t += currentUnsharedDataMemory() - unshared_data_memory_start;
00171 }
00172
00173 return t;
00174 }
00175
00176 long int Timer::unshared_stack_memory(bool usageCalled)
00177 {
00178 long t = unshared_stack_memory_accum;
00179 if (state == Running)
00180 {
00181 if (!usageCalled)
00182 updateResourceUsage();
00183 t += currentUnsharedStackMemory() - unshared_stack_memory_start;
00184 }
00185
00186 return t;
00187 }
00188
00189 long int Timer::page_faults(bool usageCalled)
00190 {
00191 long t = page_faults_accum;
00192 if (state == Running)
00193 {
00194 if (!usageCalled)
00195 updateResourceUsage();
00196 t += currentPageFaults() - page_faults_start;
00197 }
00198
00199 return t;
00200 }
00201
00202 long int Timer::minor_page_faults(bool usageCalled)
00203 {
00204 long t = minor_page_faults_accum;
00205 if (state == Running)
00206 {
00207 if (!usageCalled)
00208 updateResourceUsage();
00209 t += currentMinorPageFaults() - minor_page_faults_start;
00210 }
00211
00212 return t;
00213 }
00214
00215 long int Timer::major_page_faults(bool usageCalled)
00216 {
00217 long t = major_page_faults_accum;
00218 if (state == Running)
00219 {
00220 if (!usageCalled)
00221 updateResourceUsage();
00222 t += currentMajorPageFaults() - major_page_faults_start;
00223 }
00224
00225 return t;
00226 }
00227
00228 long int Timer::blocked_input_ops(bool usageCalled)
00229 {
00230 long t = blocked_input_ops_accum;
00231 if (state == Running)
00232 {
00233 if (!usageCalled)
00234 updateResourceUsage();
00235 t += currentBlockedInputOps() - blocked_input_ops_start;
00236 }
00237
00238 return t;
00239 }
00240
00241 long int Timer::blocked_output_ops(bool usageCalled)
00242 {
00243 long t = blocked_output_ops_accum;
00244 if (state == Running)
00245 {
00246 if (!usageCalled)
00247 updateResourceUsage();
00248 t += currentBlockedOutputOps() - blocked_output_ops_start;
00249 }
00250
00251 return t;
00252 }
00253
00254 void Timer::pause()
00255 {
00256 if (state == Running)
00257 {
00258 state = Paused;
00259 updateTime();
00260 time_accum += currentElapsed() - time_start;
00261 updateResourceUsage();
00262 cpu_accum += currentCpu() - cpu_start;
00263 user_cpu_accum += currentUserCpu() - user_cpu_start;
00264 system_cpu_accum += currentSystemCpu() - system_cpu_start;
00265 max_memory_accum += currentMaxMemory() - max_memory_start;
00266 shared_memory_accum += currentSharedMemory() - shared_memory_start;
00267 unshared_data_memory_accum += currentUnsharedDataMemory() - unshared_data_memory_start;
00268 unshared_stack_memory_accum += currentUnsharedStackMemory() - unshared_stack_memory_start;
00269 page_faults_accum += currentPageFaults() - page_faults_start;
00270 minor_page_faults_accum += currentMinorPageFaults() - minor_page_faults_start;
00271 major_page_faults_accum += currentMajorPageFaults() - major_page_faults_start;
00272 blocked_input_ops_accum += currentBlockedInputOps() - blocked_input_ops_start;
00273 blocked_output_ops_accum += currentBlockedOutputOps() - blocked_output_ops_start;
00274 }
00275 }
00276
00277 void Timer::cont()
00278 {
00279 if (state == Paused)
00280 {
00281 state = Running;
00282 start();
00283 }
00284 }
00285
00286 void Timer::getTimes(double & elapsed, double & user_cpu,
00287 double & system_cpu, double & cpu,
00288 long & max_memory, long & shared_memory,
00289 long & unshared_data_memory, long & unshared_stack_memory,
00290 long & page_faults, long & minor_page_faults,
00291 long & major_page_faults, long & blocked_input_ops,
00292 long & blocked_output_ops)
00293 {
00294 updateTime();
00295 elapsed = this->elapsed();
00296 updateResourceUsage();
00297 cpu = this->cpu(true);
00298 user_cpu = this->user_cpu(true);
00299 system_cpu = this->system_cpu(true);
00300 max_memory = this->max_memory(true);
00301 shared_memory = this->shared_memory(true);
00302 unshared_data_memory = this->unshared_data_memory(true);
00303 unshared_stack_memory = this->unshared_stack_memory(true);
00304 page_faults = this->page_faults(true);
00305 minor_page_faults = this->minor_page_faults(true);
00306 major_page_faults = this->major_page_faults(true);
00307 blocked_input_ops = this->blocked_input_ops(true);
00308 blocked_output_ops = this->blocked_output_ops(true);
00309 }
00310
00311 std::ostream & operator<<(std::ostream & os, Timer & timer)
00312 {
00313 double elapsed, user_cpu, system_cpu, cpu;
00314 long max_memory, shared_memory, unshared_data_memory, unshared_stack_memory;
00315 long page_faults, minor_page_faults, major_page_faults;
00316 long blocked_input_ops, blocked_output_ops;
00317 timer.getTimes(elapsed, user_cpu, system_cpu, cpu,
00318 max_memory, shared_memory, unshared_data_memory, unshared_stack_memory,
00319 page_faults, minor_page_faults, major_page_faults,
00320 blocked_input_ops, blocked_output_ops);
00321
00322 int prec = os.precision();
00323 #ifndef SILENT
00324 os << "Timer " << timer.name() << ":" << std::endl;
00325 os << std::setprecision(8);
00326 os << "\treal: " << elapsed << "\t\t" << elapsed/60.0 << std::endl;
00327 os << "\tuser: " << user_cpu << "\t\t" << user_cpu/60.0 << std::endl;
00328 os << "\tsystem: " << system_cpu << "\t\t" << system_cpu/60.0 << std::endl;
00329 os << "\tcpu: " << cpu << "\t\t" << cpu/60.0 << std::endl;
00330 #else
00331 os << std::setprecision(2);
00332 os << "done! cpu time = " << user_cpu << "s (" << user_cpu/60.0 << "min)";
00333 os << " real time = " << elapsed << "s (" << elapsed/60.0 << "min)";
00334 #endif
00335 return os << std::setprecision(prec);
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347 }