Go to the documentation of this file.00001 #define GAUDIKERNEL_CHRONOENTITY_CPP 1
00002
00003
00004
00005
00006
00007 #include <iostream>
00008 #include <iomanip>
00009 #include <cmath>
00010 #include <algorithm>
00011 #include <cstdio>
00012
00013
00014
00015 #include "GaudiKernel/Kernel.h"
00016 #include "GaudiKernel/System.h"
00017 #include "GaudiKernel/ChronoEntity.h"
00018
00019
00020
00021 #include "boost/format.hpp"
00022
00028
00029 namespace
00030 {
00032 const double microsecond = 1 ;
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
00045
00046 ChronoEntity::ChronoEntity()
00047
00048 : m_status( IChronoSvc::UNKNOWN )
00049 {}
00050
00051
00052
00053 IChronoSvc::ChronoStatus ChronoEntity::start()
00054 {
00055 if ( IChronoSvc::RUNNING == m_status ) { return m_status ; }
00056
00057
00058
00059
00060 m_start = System::getProcessTime();
00061
00062 m_status = IChronoSvc::RUNNING;
00063
00064 return m_status ;
00065 }
00066
00067
00068
00069 IChronoSvc::ChronoStatus ChronoEntity::stop()
00070 {
00071 if ( IChronoSvc::RUNNING != m_status ) { return m_status ; }
00072
00073
00074 m_delta = System::getProcessTime() - m_start;
00075
00076
00077
00078 m_user += m_delta.userTime<TimeUnit>();
00079 m_kernel += m_delta.kernelTime<TimeUnit>();
00080 m_elapsed += m_delta.elapsedTime<TimeUnit>();
00081
00082
00083
00084 m_status = IChronoSvc::STOPPED;
00085
00086 return m_status ;
00087 }
00088
00089
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
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
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
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
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
00218
00219
00220
00221
00222
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
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 () )
00261 % ( stat -> flag () / _unit )
00262 % ( stat -> flagMean () / _unit )
00263 % ( stat -> flagRMS () / _unit )
00264 % ( stat -> flagMeanErr () / _unit )
00265 % ( stat -> flagMin () / _unit )
00266 % ( stat -> flagMax () / _unit ) ;
00267
00268 return _fmt.str() ;
00269 }
00270
00271
00272
00273
00274