Gaudi Framework, version v21r9

Home   Generated: 3 May 2010

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 #ifdef __ICC
00070 // disable icc remark #2259: non-pointer conversion from "long double" to "double" may lose significant bits
00071 #pragma warning(push)
00072 #pragma warning(disable:2259)
00073 #endif
00074 IChronoSvc::ChronoStatus  ChronoEntity::start()
00075 {
00076   if ( IChronoSvc::RUNNING == m_status ) { return m_status ; }
00077   //
00078   // following lines could be platform dependent!
00079   //
00080   // Store in object the measured times
00081   m_start_user    = static_cast<IChronoSvc::ChronoTime>(System::userTime     ( MyUnit ));
00082   m_start_kernel  = static_cast<IChronoSvc::ChronoTime>(System::kernelTime   ( MyUnit ));
00083   m_start_elapsed = static_cast<IChronoSvc::ChronoTime>(System::ellapsedTime ( MyUnit ));
00085   m_status = IChronoSvc::RUNNING;
00087   return m_status ;
00088 }
00089 #ifdef __ICC
00090 // re-enable icc remark #2259
00091 #pragma warning(pop)
00092 #endif
00093 // ============================================================================
00094 // stop the chrono
00095 // ============================================================================
00096 IChronoSvc::ChronoStatus  ChronoEntity::stop()
00097 {
00098   if ( IChronoSvc::RUNNING != m_status ) { return m_status ; }
00099   
00100   // following lines could be platform dependent!
00101   
00102   m_delta_user    = System::userTime     ( MyUnit ) - m_start_user    ;
00103   m_delta_kernel  = System::kernelTime   ( MyUnit ) - m_start_kernel  ;
00104   m_delta_elapsed = System::ellapsedTime ( MyUnit ) - m_start_elapsed ;
00105   
00106   // update the counters:
00107   
00108   m_user     += m_delta_user    ;
00109   m_kernel   += m_delta_kernel  ;
00110   m_elapsed  += m_delta_elapsed ;
00111   
00112   // set new status
00113   
00114   m_status = IChronoSvc::STOPPED;  
00115   
00116   return m_status ;
00117 }
00118 // ============================================================================
00119 // print user time
00120 // ============================================================================
00121 std::string ChronoEntity::outputUserTime      () const
00122 {
00123   std::string res ("Time User   : ") ;
00124   return res += format 
00125     ( uTotalTime     () ,
00126       uMinimalTime   () ,
00127       uMeanTime      () ,
00128       uRMSTime       () ,
00129       uMaximalTime   () ,
00130       nOfMeasurements() );
00131 }
00132 // ============================================================================
00133 // print system time
00134 // ============================================================================
00135 std::string ChronoEntity::outputSystemTime      () const
00136 {
00137   std::string res ("Time System : ") ;
00138   return res += format
00139     ( kTotalTime     () ,
00140       kMinimalTime   () ,
00141                         kMeanTime      () ,
00142                         kRMSTime       () ,
00143                         kMaximalTime   () ,
00144                         nOfMeasurements() );
00145 }
00146 // ============================================================================
00147 // print time
00148 std::string ChronoEntity::outputElapsedTime      () const
00149 {
00150   std::string res ("TimeElapsed: ") ;
00151   return res += format
00152     ( eTotalTime     () , 
00153       eMinimalTime   () , 
00154       eMeanTime      () , 
00155       eRMSTime       () , 
00156       eMaximalTime   () , 
00157       nOfMeasurements() );  
00158 }
00159 // ============================================================================
00160 // print the chrono  
00161 // ============================================================================
00162 std::string ChronoEntity::format
00163 ( const double        total     , 
00164   const double        minimal   ,
00165   const double        mean      , 
00166   const double        rms       , 
00167   const double        maximal   , 
00168   const unsigned long number    ) const
00169 {
00171   const int buffer_size         = 256 ;
00172   char      buffer[buffer_size]       ;
00173   int       index               = 0   ;
00175   long double  unit = 1.0 ;
00176   std::string cunit = ""  ; 
00178   if     ( total / microsecond  <  500 ) 
00179   { unit = microsecond ; cunit = " [us]"    ; } 
00180   else if( total / millisecond  <  500 )
00181   { unit = millisecond ; cunit = " [ms]"    ; } 
00182   else if( total /      second  <  500 ) 
00183   { unit =      second ; cunit = "  [s]"     ; }
00184   else if( total /      minute  <  500 )
00185   { unit =      minute ; cunit = "[min]"   ; }
00186   else if( total /        hour  <  500 ) 
00187     { unit =        hour ; cunit = "  [h]"     ; }
00188   else if( total /         day  <   10 )
00189   { unit =         day ; cunit = "[day]"   ; }
00190   else if( total /        week  <    5 ) 
00191   { unit =        week ; cunit = "  [w]"  ; }
00192   else if( total /       month  <   20 ) 
00193   { unit =       month ; cunit = "[mon]" ; }
00194   else                                   
00195   { unit =        year ; cunit = "  [y]"  ; } 
00197   index += sprintf( buffer + index , "Tot=%5.3g" , (double) (total / unit) ) ;
00198   index += sprintf( buffer + index , "%s" , cunit.c_str()          ) ;
00200   if( 1 < number )
00201   {
00202     
00203     if     ( mean / microsecond  <  500 ) 
00204     { unit = microsecond ; cunit = " [us]"    ; } 
00205     else if( mean / millisecond  <  500 )
00206     { unit = millisecond ; cunit = " [ms]"    ; } 
00207     else if( mean /      second  <  500 ) 
00208     { unit =      second ; cunit = "  [s]"     ; }
00209     else if( mean /      minute  <  500 )
00210     { unit =      minute ; cunit = "[min]"   ; }
00211     else if( mean /        hour  <  500 ) 
00212     { unit =        hour ; cunit = "  [h]"     ; }
00213     else if( mean /         day  <   10 )
00214     { unit =         day ; cunit = "[day]"   ; }
00215     else if( mean /        week  <    5 ) 
00216     { unit =        week ; cunit = "  [w]"  ; }
00217     else if( mean /       month  <   20 ) 
00218     { unit =       month ; cunit = "[mon]" ; }
00219     else                                   
00220     { unit =        year ; cunit = "[year]"  ; } 
00222     index += 
00223       sprintf( buffer + index , 
00224                " Ave/Min/Max=%5.3g" , (double) ( mean / unit ) ) ;
00225     index += 
00226       sprintf( buffer + index , 
00227                "(+-%5.3g)"          , (double) ( rms  / unit ) ) ;
00228     index += 
00229       sprintf( buffer + index , 
00230                "/%5.3g"             , (double) ( minimal  / unit ) ) ;
00231     index += 
00232       sprintf( buffer + index , 
00233                "/%5.3g"             , (double) ( maximal  / unit ) ) ;
00235     index += sprintf( buffer + index , "%s" , cunit.c_str() );
00237   }
00238   else
00239   { index += sprintf( buffer + index , "%44s" , " " ); }    
00241   index += sprintf( buffer + index , " #=%3lu" , number );
00243   return std::string( buffer, 0 , index );
00245 }
00246 // ============================================================================
00247 // comparison operator 
00248 // ============================================================================
00249 bool ChronoEntity::operator<( const ChronoEntity& e ) const
00250 { 
00251   return 
00252     ( &e           == this          ) ? false : 
00253     ( totalTime () < e.totalTime () ) ? true  :
00254     ( totalTime () > e.totalTime () ) ? false :
00255     ( m_user       < e.m_user       ) ? true  :
00256     ( e.m_user     <   m_user       ) ? false : 
00257     ( m_kernel     < e.m_kernel     ) ? true  :
00258     ( e.m_kernel   <   m_kernel     ) ? false : 
00259     ( m_elapsed    < e.m_elapsed    ) ? true  :
00260     ( e.m_elapsed  <   m_elapsed    ) ? false : false ;
00261 }
00262 // ============================================================================
00263 /*  print the chrono according the format and units 
00264  *  @param typ  the chrono type 
00265  *  @param fmt  the format string 
00266  *  @param unit the unit
00267  *  @return the string representations 
00268  *  @see boost::format
00269  */
00270 // ============================================================================
00271 std::string ChronoEntity::outputTime 
00272 ( IChronoSvc::ChronoType typ  , 
00273   const std::string&     fmt  , 
00274   System::TimeType       unit ) const 
00275 {
00276   boost::format _fmt ( fmt ) ;
00277   // allow various number of arguments 
00278   using namespace boost::io ;  
00279   _fmt.exceptions ( all_error_bits ^ ( too_many_args_bit | too_few_args_bit ) ) ;
00280   //
00281   double _unit = microsecond ;
00282   switch ( unit ) 
00283   {
00284   case System::Year     : _unit = year        ; break ;
00285   case System::Month    : _unit = month       ; break ;
00286   case System::Day      : _unit = day         ; break ;
00287   case System::Hour     : _unit = hour        ; break ;
00288   case System::Min      : _unit = minute      ; break ;
00289   case System::Sec      : _unit = second      ; break ;
00290   case System::milliSec : _unit = millisecond ; break ;
00291   case System::microSec : _unit = microsecond ; break ;
00292   case System::nanoSec  : _unit = nanosecond  ; break ;
00293   default               : _unit = microsecond ; break ;
00294   }
00295   //
00296   const StatEntity* stat = &m_user;
00297   switch ( typ ) 
00298   {
00299   case IChronoSvc::USER    : stat = &m_user    ; break ;
00300   case IChronoSvc::KERNEL  : stat = &m_kernel  ; break ;
00301   case IChronoSvc::ELAPSED : stat = &m_elapsed ; break ;
00302   default                  : stat = &m_user    ; break ;
00303   }
00304   //  
00305   _fmt 
00306     %   ( stat -> nEntries    ()         )   // %1 : #entries 
00307     %   ( stat -> flag        () / _unit )   // %2 : total time 
00308     %   ( stat -> flagMean    () / _unit )   // %3 : mean time 
00309     %   ( stat -> flagRMS     () / _unit )   // %4 : RMS  time 
00310     %   ( stat -> flagMeanErr () / _unit )   // %5 : error in mean time 
00311     %   ( stat -> flagMin     () / _unit )   // %6 : minimal time 
00312     %   ( stat -> flagMax     () / _unit ) ; // %7 : maximal time 
00313   //
00314   return _fmt.str() ;
00315 }
00316 // ==========================================================================
00317 
00318 // ============================================================================
00319 // The END 
00320 // ============================================================================

Generated at Mon May 3 12:14:32 2010 for Gaudi Framework, version v21r9 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004