Gaudi Framework, version v23r2

Home   Generated: Thu Jun 28 2012

ChronoEntity.cpp

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

Generated at Thu Jun 28 2012 23:27:24 for Gaudi Framework, version v23r2 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004