Gaudi Framework, version v22r4

Home   Generated: Fri Sep 2 2011

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()
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 {
00170 
00172   boost::format fmt("Tot=%2$5.3g%1$s %4$43s #=%3$3lu");
00173 
00174   long double  unit = 1.0 ;
00175 
00176   if     ( total / microsecond  <  500 )
00177   { unit = microsecond ; fmt % " [us]" ; }
00178   else if( total / millisecond  <  500 )
00179   { unit = millisecond ; fmt % " [ms]" ; }
00180   else if( total /      second  <  500 )
00181   { unit =      second ; fmt % "  [s]" ; }
00182   else if( total /      minute  <  500 )
00183   { unit =      minute ; fmt % "[min]" ; }
00184   else if( total /        hour  <  500 )
00185   { unit =        hour ; fmt % "  [h]" ; }
00186   else if( total /         day  <   10 )
00187   { unit =         day ; fmt % "[day]" ; }
00188   else if( total /        week  <    5 )
00189   { unit =        week ; fmt % "  [w]" ; }
00190   else if( total /       month  <   20 )
00191   { unit =       month ; fmt % "[mon]" ; }
00192   else
00193   { unit =        year ; fmt % "  [y]" ; }
00194 
00195   fmt % (double) (total / unit) % number;
00196 
00197   if( 1 < number )
00198   {
00200     boost::format fmt1("Ave/Min/Max=%2$5.3g(+-%3$5.3g)/%4$5.3g/%5$5.3g%1$s");
00201     if     ( mean / microsecond  <  500 )
00202     { unit = microsecond ; fmt1 % " [us]" ; }
00203     else if( mean / millisecond  <  500 )
00204     { unit = millisecond ; fmt1 % " [ms]" ; }
00205     else if( mean /      second  <  500 )
00206     { unit =      second ; fmt1 % "  [s]" ; }
00207     else if( mean /      minute  <  500 )
00208     { unit =      minute ; fmt1 % "[min]" ; }
00209     else if( mean /        hour  <  500 )
00210     { unit =        hour ; fmt1 % "  [h]" ; }
00211     else if( mean /         day  <   10 )
00212     { unit =         day ; fmt1 % "[day]" ; }
00213     else if( mean /        week  <    5 )
00214     { unit =        week ; fmt1 % "  [w]" ; }
00215     else if( mean /       month  <   20 )
00216     { unit =       month ; fmt1 % "[mon]" ; }
00217     else
00218     { unit =        year ; fmt1 % "  [y]" ; }
00219 
00220     fmt1 % (double) ( mean / unit ) % (double) ( rms  / unit )
00221          % (double) ( minimal  / unit ) % (double) ( maximal  / unit );
00222     fmt % fmt1.str();
00223   }
00224   else {
00225     fmt % "";
00226   }
00227 
00228   return fmt.str();
00229 }
00230 // ============================================================================
00231 // comparison operator
00232 // ============================================================================
00233 bool ChronoEntity::operator<( const ChronoEntity& e ) const
00234 {
00235   return
00236     ( &e           == this          ) ? false :
00237     ( totalTime () < e.totalTime () ) ? true  :
00238     ( totalTime () > e.totalTime () ) ? false :
00239     ( m_user       < e.m_user       ) ? true  :
00240     ( e.m_user     <   m_user       ) ? false :
00241     ( m_kernel     < e.m_kernel     ) ? true  :
00242     ( e.m_kernel   <   m_kernel     ) ? false :
00243     ( m_elapsed    < e.m_elapsed    ) ? true  :
00244     ( e.m_elapsed  <   m_elapsed    ) ? false : false ;
00245 }
00246 // ============================================================================
00247 /*  print the chrono according the format and units
00248  *  @param typ  the chrono type
00249  *  @param fmt  the format string
00250  *  @param unit the unit
00251  *  @return the string representations
00252  *  @see boost::format
00253  */
00254 // ============================================================================
00255 std::string ChronoEntity::outputTime
00256 ( IChronoSvc::ChronoType typ  ,
00257   const std::string&     fmt  ,
00258   System::TimeType       unit ) const
00259 {
00260   boost::format _fmt ( fmt ) ;
00261   // allow various number of arguments
00262   using namespace boost::io ;
00263   _fmt.exceptions ( all_error_bits ^ ( too_many_args_bit | too_few_args_bit ) ) ;
00264   //
00265   double _unit = microsecond ;
00266   switch ( unit )
00267   {
00268   case System::Year     : _unit = year        ; break ;
00269   case System::Month    : _unit = month       ; break ;
00270   case System::Day      : _unit = day         ; break ;
00271   case System::Hour     : _unit = hour        ; break ;
00272   case System::Min      : _unit = minute      ; break ;
00273   case System::Sec      : _unit = second      ; break ;
00274   case System::milliSec : _unit = millisecond ; break ;
00275   case System::microSec : _unit = microsecond ; break ;
00276   case System::nanoSec  : _unit = nanosecond  ; break ;
00277   default               : _unit = microsecond ; break ;
00278   }
00279   //
00280   const StatEntity* stat = &m_user;
00281   switch ( typ )
00282   {
00283   case IChronoSvc::USER    : stat = &m_user    ; break ;
00284   case IChronoSvc::KERNEL  : stat = &m_kernel  ; break ;
00285   case IChronoSvc::ELAPSED : stat = &m_elapsed ; break ;
00286   default                  : stat = &m_user    ; break ;
00287   }
00288   //
00289   _fmt
00290     %   ( stat -> nEntries    ()         )   // %1 : #entries
00291     %   ( stat -> flag        () / _unit )   // %2 : total time
00292     %   ( stat -> flagMean    () / _unit )   // %3 : mean time
00293     %   ( stat -> flagRMS     () / _unit )   // %4 : RMS  time
00294     %   ( stat -> flagMeanErr () / _unit )   // %5 : error in mean time
00295     %   ( stat -> flagMin     () / _unit )   // %6 : minimal time
00296     %   ( stat -> flagMax     () / _unit ) ; // %7 : maximal time
00297   //
00298   return _fmt.str() ;
00299 }
00300 // ==========================================================================
00301 
00302 // ============================================================================
00303 // The END
00304 // ============================================================================
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Fri Sep 2 2011 16:24:41 for Gaudi Framework, version v22r4 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004