Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

ChronoEntity.cpp

Go to the documentation of this file.
00001 #include <iostream> 
00002 #include <iomanip> 
00003 #include <strstream> 
00004 #include <cmath> 
00005 #include <algorithm> 
00006 
00007 
00008 // 
00009 #include "GaudiKernel/Kernel.h" 
00010 #include "GaudiKernel/System.h" 
00011 //
00012 //   Implementation of class ChronoEntity 
00013 //
00014 //  Author: Vanya Belyaev 
00015 //  Date:   December 1, 1999 
00016 // 
00017 // 
00018 
00019 
00020 #include "ChronoEntity.h" 
00021 
00022 
00023 //
00024 //
00025 // Constructor 
00026 ChronoEntity::ChronoEntity() 
00028   : m_ce_currentStatus ( IChronoStatSvc::UNKNOWN )  
00030   , m_ce_noOfMeasurements                      ( 0          ) 
00032   , m_ce_minimalUserTime                       ( 1000000000 ) 
00034   , m_ce_minimalKernelTime                     ( 1000000000 )   
00036   , m_ce_minimalEllapsedTime                   ( 1000000000 )   
00038   , m_ce_maximalUserTime                       ( 0          ) 
00040   , m_ce_maximalKernelTime                     ( 0          ) 
00042   , m_ce_maximalEllapsedTime                   ( 0          ) 
00044   , m_ce_totalUserTime                         ( 0          ) 
00046   , m_ce_totalKernelTime                       ( 0          ) 
00048   , m_ce_totalEllapsedTime                     ( 0          ) 
00050   , m_ce_statisticsForUserTime                 ( 0          ) 
00052   , m_ce_statisticsForKernelTime               ( 0          ) 
00054   , m_ce_statisticsForEllapsedTime             ( 0          ) 
00056   , m_ce_startOfCurrentMeasurementOfUserTime   ( 0          ) 
00058   , m_ce_startOfCurrentMeasurementOfKernelTime ( 0          ) 
00060   , m_ce_startOfCurrentMeasurementOfEllapsedTime ( 0          ) 
00061 {};
00062 
00063 
00064 
00068 IChronoStatSvc::ChronoStatus  ChronoEntity::start() 
00069 {
00070   if ( IChronoStatSvc::RUNNING == status() ) { return status() ; }   
00076   // Store in object the measured times
00077   m_ce_startOfCurrentMeasurementOfUserTime     = System::userTime     ( System::microSec );
00078   m_ce_startOfCurrentMeasurementOfKernelTime   = System::kernelTime   ( System::microSec );
00079   m_ce_startOfCurrentMeasurementOfEllapsedTime = System::ellapsedTime ( System::microSec );
00082   m_ce_currentStatus = IChronoStatSvc::RUNNING; 
00084   return status(); 
00085 };
00086 
00087 
00088 //
00089 // 
00090 // stop the chrono  
00091 IChronoStatSvc::ChronoStatus  ChronoEntity::stop() 
00092 {
00093   if( IChronoStatSvc::RUNNING != status() ) { return status(); } 
00094 
00101   time_type deltaUser     = System::userTime    ( System::microSec ) - 
00102     m_ce_startOfCurrentMeasurementOfUserTime   ;
00104   time_type deltaKernel   = System::kernelTime  ( System::microSec ) - 
00105     m_ce_startOfCurrentMeasurementOfKernelTime ;
00107   time_type deltaEllapsed = System::ellapsedTime( System::microSec ) - 
00108     m_ce_startOfCurrentMeasurementOfEllapsedTime ;
00116   ++m_ce_noOfMeasurements; 
00119   m_ce_minimalUserTime     = ( deltaUser     < m_ce_minimalUserTime     ) ? deltaUser     : m_ce_minimalUserTime    ; 
00122   m_ce_minimalKernelTime   = ( deltaKernel   < m_ce_minimalKernelTime   ) ? deltaKernel   : m_ce_minimalKernelTime  ; 
00125   m_ce_minimalEllapsedTime = ( deltaEllapsed < m_ce_minimalEllapsedTime ) ? deltaEllapsed : m_ce_minimalEllapsedTime ; 
00128   m_ce_maximalUserTime     = ( deltaUser     > m_ce_maximalUserTime     ) ? deltaUser     : m_ce_maximalUserTime     ; 
00131   m_ce_maximalKernelTime   = ( deltaKernel   > m_ce_maximalKernelTime   ) ? deltaKernel   : m_ce_maximalKernelTime   ;
00134   m_ce_maximalEllapsedTime = ( deltaEllapsed > m_ce_maximalEllapsedTime ) ? deltaEllapsed : m_ce_maximalEllapsedTime ;
00137   m_ce_totalUserTime             += deltaUser     ; 
00140   m_ce_totalKernelTime           += deltaKernel   ;
00143   m_ce_totalEllapsedTime         += deltaEllapsed ;
00146   m_ce_statisticsForUserTime     += deltaUser     * deltaUser     ;    
00149   m_ce_statisticsForKernelTime   += deltaKernel   * deltaKernel   ;
00152   m_ce_statisticsForEllapsedTime += deltaEllapsed * deltaEllapsed ;
00155   m_ce_currentStatus = IChronoStatSvc::STOPPED;
00157   return status();
00158 };
00159 
00163 std::string ChronoEntity::format( long double   total     , 
00164                                   long double   minimal   ,
00165                                   long double   mean      , 
00166                                   long double   rms       , 
00167                                   long double   maximal   , 
00168                                   unsigned long number    ) const
00169 {
00170 
00174   long double microsecond  =  1.0               ;     
00175   long double millisecond  = 1000 * microsecond ;
00176   long double second       = 1000 * millisecond ; 
00177   long double minute       =   60 *      second ; 
00178   long double hour         =   60 *      minute ; 
00179   long double day          =   24 *        hour ; 
00180   long double week         =    7 *         day ; 
00181   long double month        =   30 *         day ;
00182   long double year         =  365 *         day ; 
00183 
00187   const int buffer_size = 1024;  
00188   char buffer[ buffer_size ] = { 0 , 0 }; 
00189   std::ostrstream ost(buffer, buffer_size); 
00191   long double  unit = 1.0 ;
00192   std::string cunit = ""  ; 
00194   if     ( total / microsecond  <  100 ) { unit = microsecond ; cunit = " [us]"   ; } 
00195   else if( total / millisecond  <  100 ) { unit = millisecond ; cunit = " [ms]"   ; } 
00196   else if( total /      second  <  100 ) { unit =      second ; cunit = "  [s]"   ; }
00197   else if( total /      minute  <  100 ) { unit =      minute ; cunit = "[min]"   ; }
00198   else if( total /        hour  <  100 ) { unit =        hour ; cunit = "  [h]"   ; }
00199   else if( total /         day  <   10 ) { unit =         day ; cunit = "[day]"   ; }
00200   else if( total /        week  <    5 ) { unit =        week ; cunit = "[week]"  ; }
00201   else if( total /       month  <   20 ) { unit =       month ; cunit = "[month]" ; }
00202   else                                   { unit =        year ; cunit = "[year]"  ; } 
00204   ost << "Tot=" << std::setw(5) << std::setprecision(3) << total / unit << cunit ;    
00206   if( 1 < number )
00207     { 
00210       if     ( mean / microsecond  <  100 ) { unit = microsecond ; cunit = " [us]"     ; } 
00211       else if( mean / millisecond  <  100 ) { unit = millisecond ; cunit = " [ms]"     ; } 
00212       else if( mean /      second  <  100 ) { unit =      second ; cunit = "  [s]"     ; }
00213       else if( mean /      minute  <  100 ) { unit =      minute ; cunit = "[min]"     ; }
00214       else if( mean /        hour  <  100 ) { unit =        hour ; cunit = "  [h]"     ; }
00215       else if( mean /         day  <   10 ) { unit =         day ; cunit = "[day]"     ; }
00216       else if( mean /        week  <    5 ) { unit =        week ; cunit = "[week]"    ; }
00217       else if( mean /       month  <   20 ) { unit =       month ; cunit = "[month]"   ; }
00218       else                                  { unit =        year ; cunit = " [year]"    ; } 
00220       if( 0 == rms || minimal == maximal ) 
00221         {  ost << "\tMean= " << std::setw(5) << std::setprecision(3) << mean / unit;  } 
00222       else
00223         {
00224           ost << "\tMean="  << std::setw(5) << std::setprecision(3) << mean     / unit   
00225               << "+-"       << std::setw(4) << std::setprecision(2) << rms      / unit   
00226               << "\tMin="   << std::setw(4) << std::setprecision(2) << minimal  / unit   
00227               << "\tMax="   << std::setw(4) << std::setprecision(2) << maximal  / unit ; 
00228         }
00230       ost << " " << cunit; 
00232       ost << "\t(#=" << number << ")"; 
00233     }
00236   std::string res;
00237   res += ost.str(); 
00239   return res;
00241 };
00242 
00243 
00244 
00245 
00246 
00247 
00248 
00249 

Generated at Wed Nov 21 12:22:29 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000