Gaudi Framework, version v20r2

Generated: 18 Jul 2008

ChronoEntity.cpp

Go to the documentation of this file.
00001 // $Id: ChronoEntity.cpp,v 1.4 2008/06/06 13:20:13 marcocle Exp $ 
00002 // ============================================================================
00003 #define GAUDIKERNEL_CHRONOENTITY_CPP 1 
00004 // ============================================================================
00005 // incldue files 
00006 // ============================================================================
00007 // STD & STL 
00008 // ============================================================================
00009 #include <iostream> 
00010 #include <iomanip> 
00011 #include <cmath> 
00012 #include <algorithm>
00013 #include <cstdio>
00014 // ============================================================================
00015 // GaudiKernel
00016 // ============================================================================
00017 #include "GaudiKernel/Kernel.h" 
00018 #include "GaudiKernel/System.h" 
00019 #include "GaudiKernel/ChronoEntity.h" 
00020 // ============================================================================
00021 // Boost 
00022 // ============================================================================
00023 #include "boost/format.hpp"
00024 // ============================================================================
00030 // ============================================================================
00031 namespace 
00032 {
00034   const System::TimeType MyUnit = System::microSec ; // unit here is microsecond 
00036   const double microsecond  =    1                 ; // unit here is microsecond 
00037   const double millisecond  = 1000  * microsecond ;
00038   const double second       = 1000  * millisecond ; 
00039   const double minute       =   60  *      second ; 
00040   const double hour         =   60  *      minute ; 
00041   const double day          =   24  *        hour ; 
00042   const double week         =    7  *         day ; 
00043   const double month        =   30  *         day ;
00044   const double year         =  365  *         day ;
00045   const double nanosecond   = 0.001 * microsecond ;
00046 }
00047 // ============================================================================
00048 // Constructor 
00049 // ============================================================================
00050 ChronoEntity::ChronoEntity() 
00051   
00052   : m_status        ( IChronoSvc::UNKNOWN )  // current status
00054   , m_delta_user    ( -1 ) // delta user time
00056   , m_delta_kernel  ( -1 ) // delta kernel time
00058   , m_delta_elapsed ( -1 ) // delta elapsed time
00060   , m_start_user    (  0 ) // start for user 
00062   , m_start_kernel  (  0 ) // start for kernel 
00064   , m_start_elapsed (  0 ) // start for elapsed  
00065 {}
00066 // ============================================================================
00067 // start the chrono
00068 // ============================================================================
00069 IChronoSvc::ChronoStatus  ChronoEntity::start()
00070 {
00071   if ( IChronoSvc::RUNNING == m_status ) { return m_status ; }
00072   //
00073   // following lines could be platform dependent!
00074   //
00075   // Store in object the measured times
00076   m_start_user    = static_cast<IChronoSvc::ChronoTime>(System::userTime     ( MyUnit ));
00077   m_start_kernel  = static_cast<IChronoSvc::ChronoTime>(System::kernelTime   ( MyUnit ));
00078   m_start_elapsed = static_cast<IChronoSvc::ChronoTime>(System::ellapsedTime ( MyUnit ));
00080   m_status = IChronoSvc::RUNNING;
00082   return m_status ;
00083 }
00084 // ============================================================================
00085 // stop the chrono
00086 // ============================================================================
00087 IChronoSvc::ChronoStatus  ChronoEntity::stop()
00088 {
00089   if ( IChronoSvc::RUNNING != m_status ) { return m_status ; }
00090   
00091   // following lines could be platform dependent!
00092   
00093   m_delta_user    = System::userTime     ( MyUnit ) - m_start_user    ;
00094   m_delta_kernel  = System::kernelTime   ( MyUnit ) - m_start_kernel  ;
00095   m_delta_elapsed = System::ellapsedTime ( MyUnit ) - m_start_elapsed ;
00096   
00097   // update the counters:
00098   
00099   m_user     += m_delta_user    ;
00100   m_kernel   += m_delta_kernel  ;
00101   m_elapsed  += m_delta_elapsed ;
00102   
00103   // set new status
00104   
00105   m_status = IChronoSvc::STOPPED;  
00106   
00107   return m_status ;
00108 }
00109 // ============================================================================
00110 // print user time
00111 // ============================================================================
00112 std::string ChronoEntity::outputUserTime      () const
00113 {
00114   std::string res ("Time User   : ") ;
00115   return res += format 
00116     ( uTotalTime     () ,
00117       uMinimalTime   () ,
00118       uMeanTime      () ,
00119       uRMSTime       () ,
00120       uMaximalTime   () ,
00121       nOfMeasurements() );
00122 }
00123 // ============================================================================
00124 // print system time
00125 // ============================================================================
00126 std::string ChronoEntity::outputSystemTime      () const
00127 {
00128   std::string res ("Time System : ") ;
00129   return res += format
00130     ( kTotalTime     () ,
00131       kMinimalTime   () ,
00132                         kMeanTime      () ,
00133                         kRMSTime       () ,
00134                         kMaximalTime   () ,
00135                         nOfMeasurements() );
00136 }
00137 // ============================================================================
00138 // print time
00139 std::string ChronoEntity::outputElapsedTime      () const
00140 {
00141   std::string res ("TimeElapsed: ") ;
00142   return res += format
00143     ( eTotalTime     () , 
00144       eMinimalTime   () , 
00145       eMeanTime      () , 
00146       eRMSTime       () , 
00147       eMaximalTime   () , 
00148       nOfMeasurements() );  
00149 }
00150 // ============================================================================
00151 // print the chrono  
00152 // ============================================================================
00153 std::string ChronoEntity::format
00154 ( const double        total     , 
00155   const double        minimal   ,
00156   const double        mean      , 
00157   const double        rms       , 
00158   const double        maximal   , 
00159   const unsigned long number    ) const
00160 {
00162   const int buffer_size         = 256 ;
00163   char      buffer[buffer_size]       ;
00164   int       index               = 0   ;
00166   long double  unit = 1.0 ;
00167   std::string cunit = ""  ; 
00169   if     ( total / microsecond  <  500 ) 
00170   { unit = microsecond ; cunit = " [us]"    ; } 
00171   else if( total / millisecond  <  500 )
00172   { unit = millisecond ; cunit = " [ms]"    ; } 
00173   else if( total /      second  <  500 ) 
00174   { unit =      second ; cunit = "  [s]"     ; }
00175   else if( total /      minute  <  500 )
00176   { unit =      minute ; cunit = "[min]"   ; }
00177   else if( total /        hour  <  500 ) 
00178     { unit =        hour ; cunit = "  [h]"     ; }
00179   else if( total /         day  <   10 )
00180   { unit =         day ; cunit = "[day]"   ; }
00181   else if( total /        week  <    5 ) 
00182   { unit =        week ; cunit = "  [w]"  ; }
00183   else if( total /       month  <   20 ) 
00184   { unit =       month ; cunit = "[mon]" ; }
00185   else                                   
00186   { unit =        year ; cunit = "  [y]"  ; } 
00188   index += sprintf( buffer + index , "Tot=%5.3g" , (double) (total / unit) ) ;
00189   index += sprintf( buffer + index , "%s" , cunit.c_str()          ) ;
00191   if( 1 < number )
00192   {
00193     
00194     if     ( mean / microsecond  <  500 ) 
00195     { unit = microsecond ; cunit = " [us]"    ; } 
00196     else if( mean / millisecond  <  500 )
00197     { unit = millisecond ; cunit = " [ms]"    ; } 
00198     else if( mean /      second  <  500 ) 
00199     { unit =      second ; cunit = "  [s]"     ; }
00200     else if( mean /      minute  <  500 )
00201     { unit =      minute ; cunit = "[min]"   ; }
00202     else if( mean /        hour  <  500 ) 
00203     { unit =        hour ; cunit = "  [h]"     ; }
00204     else if( mean /         day  <   10 )
00205     { unit =         day ; cunit = "[day]"   ; }
00206     else if( mean /        week  <    5 ) 
00207     { unit =        week ; cunit = "  [w]"  ; }
00208     else if( mean /       month  <   20 ) 
00209     { unit =       month ; cunit = "[mon]" ; }
00210     else                                   
00211     { unit =        year ; cunit = "[year]"  ; } 
00213     index += 
00214       sprintf( buffer + index , 
00215                " Ave/Min/Max=%5.3g" , (double) ( mean / unit ) ) ;
00216     index += 
00217       sprintf( buffer + index , 
00218                "(+-%5.3g)"          , (double) ( rms  / unit ) ) ;
00219     index += 
00220       sprintf( buffer + index , 
00221                "/%5.3g"             , (double) ( minimal  / unit ) ) ;
00222     index += 
00223       sprintf( buffer + index , 
00224                "/%5.3g"             , (double) ( maximal  / unit ) ) ;
00226     index += sprintf( buffer + index , "%s" , cunit.c_str() );
00228   }
00229   else
00230   { index += sprintf( buffer + index , "%44s" , " " ); }    
00232   index += sprintf( buffer + index , " #=%3lu" , number );
00234   return std::string( buffer, 0 , index );
00236 }
00237 // ============================================================================
00238 // comparison operator 
00239 // ============================================================================
00240 bool ChronoEntity::operator<( const ChronoEntity& e ) const
00241 { 
00242   return 
00243     ( &e           == this          ) ? false : 
00244     ( totalTime () < e.totalTime () ) ? true  :
00245     ( totalTime () > e.totalTime () ) ? false :
00246     ( m_user       < e.m_user       ) ? true  :
00247     ( e.m_user     <   m_user       ) ? false : 
00248     ( m_kernel     < e.m_kernel     ) ? true  :
00249     ( e.m_kernel   <   m_kernel     ) ? false : 
00250     ( m_elapsed    < e.m_elapsed    ) ? true  :
00251     ( e.m_elapsed  <   m_elapsed    ) ? false : false ;
00252 }
00253 // ============================================================================
00254 /*  print the chrono according the format and units 
00255  *  @param typ  the chrono type 
00256  *  @param fmt  the format string 
00257  *  @param unit the unit
00258  *  @return the string representations 
00259  *  @see boost::format
00260  */
00261 // ============================================================================
00262 std::string ChronoEntity::outputTime 
00263 ( IChronoSvc::ChronoType typ  , 
00264   const std::string&     fmt  , 
00265   System::TimeType       unit ) const 
00266 {
00267   boost::format _fmt ( fmt ) ;
00268   // allow various number of arguments 
00269   using namespace boost::io ;  
00270   _fmt.exceptions ( all_error_bits ^ ( too_many_args_bit | too_few_args_bit ) ) ;
00271   //
00272   double _unit = microsecond ;
00273   switch ( unit ) 
00274   {
00275   case System::Year     : _unit = year        ; break ;
00276   case System::Month    : _unit = month       ; break ;
00277   case System::Day      : _unit = day         ; break ;
00278   case System::Hour     : _unit = hour        ; break ;
00279   case System::Min      : _unit = minute      ; break ;
00280   case System::Sec      : _unit = second      ; break ;
00281   case System::milliSec : _unit = millisecond ; break ;
00282   case System::microSec : _unit = microsecond ; break ;
00283   case System::nanoSec  : _unit = nanosecond  ; break ;
00284   default               : _unit = microsecond ; break ;
00285   }
00286   //
00287   const StatEntity* stat = &m_user;
00288   switch ( typ ) 
00289   {
00290   case IChronoSvc::USER    : stat = &m_user    ; break ;
00291   case IChronoSvc::KERNEL  : stat = &m_kernel  ; break ;
00292   case IChronoSvc::ELAPSED : stat = &m_elapsed ; break ;
00293   default                  : stat = &m_user    ; break ;
00294   }
00295   //  
00296   _fmt 
00297     %   ( stat -> nEntries    ()         )   // %1 : #entries 
00298     %   ( stat -> flag        () / _unit )   // %2 : total time 
00299     %   ( stat -> flagMean    () / _unit )   // %3 : mean time 
00300     %   ( stat -> flagRMS     () / _unit )   // %4 : RMS  time 
00301     %   ( stat -> flagMeanErr () / _unit )   // %5 : error in mean time 
00302     %   ( stat -> flagMin     () / _unit )   // %6 : minimal time 
00303     %   ( stat -> flagMax     () / _unit ) ; // %7 : maximal time 
00304   //
00305   return _fmt.str() ;
00306 }
00307 // ==========================================================================
00308 
00309 // ============================================================================
00310 // The END 
00311 // ============================================================================

Generated at Fri Jul 18 11:59:22 2008 for Gaudi Framework, version v20r2 by Doxygen version 1.5.1 written by Dimitri van Heesch, © 1997-2004