Timer.cpp

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2004 CSIRO ICT Centre
00003  *
00004  * $Id: Timer.cpp 1809 2006-02-10 15:10:00Z rsc $
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   os << " max mem= " << max_memory << "\t";
00338   os << " shared mem= " << shared_memory << "\t";
00339   os << " data mem= " << unshared_data_memory << "\t";
00340   os << " stack mem= " << unshared_stack_memory << "\t";
00341   os << " page faults= " << page_faults << "\t";
00342   os << " minor faults= " << minor_page_faults << "\t";
00343   os << " major faults= " << major_page_faults << "\t";
00344   os << " blocked input= " << blocked_input_ops << "\t";
00345   os << " blocked output= " << blocked_output_ops << "\t";
00346 */
00347 }
Generated on Mon Oct 4 10:39:55 2010 for Matching.kdevelop by  doxygen 1.6.3