00001 #ifndef __GAUDI_CHRONOSTATSVC_CHRONOENTITY_H__
00002 #define __GAUDI_CHRONOSTATSVC_CHRONOENTITY_H__
00003
00004 #include <string>
00005 #include <vector>
00006 #include <functional>
00007 #include <cmath>
00008
00009 #include "GaudiKernel/Kernel.h"
00010
00011 #include "GaudiKernel/IChronoStatSvc.h"
00012
00019
00020 class ChronoEntity
00021 {
00022 public:
00027 typedef longlong time_type;
00030 ChronoEntity();
00033 ~ChronoEntity(){};
00035 public:
00039 IChronoStatSvc::ChronoStatus start() ;
00043 IChronoStatSvc::ChronoStatus stop () ;
00044
00048 inline std::string outputUserTime () const;
00049 inline std::string outputSystemTime () const;
00050 inline std::string outputEllapsedTime () const;
00053 inline IChronoStatSvc::ChronoStatus status() const { return m_ce_currentStatus; };
00056 inline bool operator<( const ChronoEntity& entity ) const;
00060 inline unsigned long nOfMeasurements() const { return m_ce_noOfMeasurements;};
00064 inline long double uMinimalTime () const { return m_ce_minimalUserTime ; };
00067 inline long double kMinimalTime () const { return m_ce_minimalKernelTime ; };
00070 inline long double eMinimalTime () const { return m_ce_minimalEllapsedTime ; };
00073 inline long double uMaximalTime () const { return m_ce_maximalUserTime ; };
00076 inline long double kMaximalTime () const { return m_ce_maximalKernelTime ; };
00079 inline long double eMaximalTime () const { return m_ce_maximalEllapsedTime ; };
00082 inline long double uTotalTime () const { return m_ce_totalUserTime ; };
00085 inline long double kTotalTime () const { return m_ce_totalKernelTime ; };
00088 inline long double eTotalTime () const { return m_ce_totalEllapsedTime ; };
00091 inline long double totalTime () const { return uTotalTime() + kTotalTime() ; };
00094 inline long double uStatistics () const { return m_ce_statisticsForUserTime ; };
00097 inline long double kStatistics () const { return m_ce_statisticsForKernelTime ; };
00100 inline long double eStatistics () const { return m_ce_statisticsForEllapsedTime ; };
00104 inline long double kMeanTime () const { return ( 0 == nOfMeasurements() ) ? 0 : kTotalTime() / nOfMeasurements() ; } ;
00106 inline long double uMeanTime () const { return ( 0 == nOfMeasurements() ) ? 0 : uTotalTime() / nOfMeasurements() ; } ;
00108 inline long double eMeanTime () const { return ( 0 == nOfMeasurements() ) ? 0 : eTotalTime() / nOfMeasurements() ; } ;
00110 inline long double kRMSTime () const ;
00112 inline long double uRMSTime () const ;
00114 inline long double eRMSTime () const ;
00116 inline long double kMeanErrorTime () const ;
00118 inline long double uMeanErrorTime () const ;
00120 inline long double eMeanErrorTime () const ;
00122 public:
00125 class ComparePairOfChronoEntityAndChronoTag;
00128 protected:
00130 std::string format( long double total ,
00131 long double minimal ,
00132 long double mean ,
00133 long double rms ,
00134 long double maximal ,
00135 unsigned long number ) const;
00137 private:
00140 IChronoStatSvc::ChronoStatus m_ce_currentStatus;
00143 unsigned long m_ce_noOfMeasurements;
00146 time_type m_ce_minimalUserTime;
00149 time_type m_ce_minimalKernelTime;
00152 time_type m_ce_minimalEllapsedTime;
00155 time_type m_ce_maximalUserTime;
00158 time_type m_ce_maximalKernelTime;
00161 time_type m_ce_maximalEllapsedTime;
00164 time_type m_ce_totalUserTime;
00167 time_type m_ce_totalKernelTime;
00170 time_type m_ce_totalEllapsedTime;
00173 time_type m_ce_statisticsForUserTime;
00176 time_type m_ce_statisticsForKernelTime;
00179 time_type m_ce_statisticsForEllapsedTime;
00182 time_type m_ce_startOfCurrentMeasurementOfUserTime;
00185 time_type m_ce_startOfCurrentMeasurementOfKernelTime;
00188 time_type m_ce_startOfCurrentMeasurementOfEllapsedTime;
00190 };
00191
00196 inline long double ChronoEntity::kRMSTime () const
00197 {
00198 long double D =
00199 ( 0 == nOfMeasurements() ) ? 0 : ( kStatistics() / ( long double ) nOfMeasurements() - kMeanTime() * kMeanTime() ) ;
00200 return ( 0 > D ) ? 0 : sqrt( D ) ;
00201 };
00205 inline long double ChronoEntity::uRMSTime () const
00206 {
00207 long double D =
00208 ( 0 == nOfMeasurements() ) ? 0 : ( uStatistics() / ( long double ) nOfMeasurements() - uMeanTime() * uMeanTime() ) ;
00209 return ( 0 > D ) ? 0 : sqrt( D ) ;
00210 };
00214 inline long double ChronoEntity::eRMSTime () const
00215 {
00216 long double D =
00217 ( 0 == nOfMeasurements() ) ? 0 : ( eStatistics() / ( long double ) nOfMeasurements() - eMeanTime() * eMeanTime() ) ;
00218 return ( 0 > D ) ? 0 : sqrt( D ) ;
00219 };
00223 inline long double ChronoEntity::kMeanErrorTime () const
00224 { return ( 0 == nOfMeasurements() ) ? 0 : ( kRMSTime() / sqrt( ( long double ) nOfMeasurements() ) ) ; }
00228 inline long double ChronoEntity::uMeanErrorTime () const
00229 { return ( 0 == nOfMeasurements() ) ? 0 : ( uRMSTime() / sqrt( ( long double ) nOfMeasurements() ) ) ; }
00233 inline long double ChronoEntity::eMeanErrorTime () const
00234 { return ( 0 == nOfMeasurements() ) ? 0 : ( eRMSTime() / sqrt( ( long double ) nOfMeasurements() ) ) ; }
00238 inline bool ChronoEntity::operator<( const ChronoEntity& e ) const
00239 {
00240 return
00241 ( totalTime () < e.totalTime () ) ? true :
00242 ( totalTime () > e.totalTime () ) ? false :
00243 ( eTotalTime() < e.eTotalTime() ) ? true :
00244 ( eTotalTime() > e.eTotalTime() ) ? false :
00245 ( uTotalTime() < e.uTotalTime() ) ? true :
00246 ( uTotalTime() > e.uTotalTime() ) ? false : false ;
00247 }
00251 class ChronoEntity::ComparePairOfChronoEntityAndChronoTag
00252 : public std::binary_function< const std::pair<ChronoEntity*,const IChronoStatSvc::ChronoTag*>& ,
00253 const std::pair< ChronoEntity*,const IChronoStatSvc::ChronoTag*>& , bool >
00254 {
00255 public:
00256 inline bool operator() ( const std::pair<ChronoEntity*,const IChronoStatSvc::ChronoTag*>& p1 ,
00257 const std::pair< ChronoEntity*,const IChronoStatSvc::ChronoTag*>& p2 ) const
00258 {
00259 const ChronoEntity* e1 = p1.first;
00260 const ChronoEntity* e2 = p2.first;
00261 return ( ( 0 == e1 || 0 == e2 ) ? true : (*e1)<(*e2) ) ;
00262 }
00264 };
00265
00269
00270 inline std::string ChronoEntity::outputUserTime () const
00271 {
00272 std::string res ("Time User : ") ;
00273 return res += format( uTotalTime () ,
00274 uMinimalTime () ,
00275 uMeanTime () ,
00276 uRMSTime () ,
00277 uMaximalTime () ,
00278 nOfMeasurements() );
00279 };
00280
00281
00285
00286 inline std::string ChronoEntity::outputSystemTime () const
00287 {
00288 std::string res ("Time System : ") ;
00289 return res += format( kTotalTime () ,
00290 kMinimalTime () ,
00291 kMeanTime () ,
00292 kRMSTime () ,
00293 kMaximalTime () ,
00294 nOfMeasurements() );
00295 };
00296
00300
00301 inline std::string ChronoEntity::outputEllapsedTime () const
00302 {
00303 std::string res ("TimeEllapsed: ") ;
00304 return res += format( eTotalTime () ,
00305 eMinimalTime () ,
00306 eMeanTime () ,
00307 eRMSTime () ,
00308 eMaximalTime () ,
00309 nOfMeasurements() );
00310 };
00311
00315 #endif // __GAUDI_CHRONOSTATSVC_CHRONOENTITY_H__
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325