00001
00002
00003 #define GAUDIKERNEL_CHRONOENTITY_CPP 1
00004
00005
00006
00007
00008
00009 #include <iostream>
00010 #include <iomanip>
00011 #include <cmath>
00012 #include <algorithm>
00013 #include <cstdio>
00014
00015
00016
00017 #include "GaudiKernel/Kernel.h"
00018 #include "GaudiKernel/System.h"
00019 #include "GaudiKernel/ChronoEntity.h"
00020
00021
00022
00023 #include "boost/format.hpp"
00024
00030
00031 namespace
00032 {
00034 const System::TimeType MyUnit = System::microSec ;
00036 const double microsecond = 1 ;
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
00049
00050 ChronoEntity::ChronoEntity()
00051
00052 : m_status ( IChronoSvc::UNKNOWN )
00054 , m_delta_user ( -1 )
00056 , m_delta_kernel ( -1 )
00058 , m_delta_elapsed ( -1 )
00060 , m_start_user ( 0 )
00062 , m_start_kernel ( 0 )
00064 , m_start_elapsed ( 0 )
00065 {}
00066
00067
00068
00069 IChronoSvc::ChronoStatus ChronoEntity::start()
00070 {
00071 if ( IChronoSvc::RUNNING == m_status ) { return m_status ; }
00072
00073
00074
00075
00076 m_start_user = static_cast<IChronoSvc::ChronoTime>(System::userTime ( MyUnit ));
00077 m_start_kernel = static_cast<IChronoSvc::ChronoTime>(System::kernelTime ( MyUnit ));
00078 m_start_elapsed = static_cast<IChronoSvc::ChronoTime>(System::ellapsedTime ( MyUnit ));
00080 m_status = IChronoSvc::RUNNING;
00082 return m_status ;
00083 }
00084
00085
00086
00087 IChronoSvc::ChronoStatus ChronoEntity::stop()
00088 {
00089 if ( IChronoSvc::RUNNING != m_status ) { return m_status ; }
00090
00091
00092
00093 m_delta_user = System::userTime ( MyUnit ) - m_start_user ;
00094 m_delta_kernel = System::kernelTime ( MyUnit ) - m_start_kernel ;
00095 m_delta_elapsed = System::ellapsedTime ( MyUnit ) - m_start_elapsed ;
00096
00097
00098
00099 m_user += m_delta_user ;
00100 m_kernel += m_delta_kernel ;
00101 m_elapsed += m_delta_elapsed ;
00102
00103
00104
00105 m_status = IChronoSvc::STOPPED;
00106
00107 return m_status ;
00108 }
00109
00110
00111
00112 std::string ChronoEntity::outputUserTime () const
00113 {
00114 std::string res ("Time User : ") ;
00115 return res += format
00116 ( uTotalTime () ,
00117 uMinimalTime () ,
00118 uMeanTime () ,
00119 uRMSTime () ,
00120 uMaximalTime () ,
00121 nOfMeasurements() );
00122 }
00123
00124
00125
00126 std::string ChronoEntity::outputSystemTime () const
00127 {
00128 std::string res ("Time System : ") ;
00129 return res += format
00130 ( kTotalTime () ,
00131 kMinimalTime () ,
00132 kMeanTime () ,
00133 kRMSTime () ,
00134 kMaximalTime () ,
00135 nOfMeasurements() );
00136 }
00137
00138
00139 std::string ChronoEntity::outputElapsedTime () const
00140 {
00141 std::string res ("TimeElapsed: ") ;
00142 return res += format
00143 ( eTotalTime () ,
00144 eMinimalTime () ,
00145 eMeanTime () ,
00146 eRMSTime () ,
00147 eMaximalTime () ,
00148 nOfMeasurements() );
00149 }
00150
00151
00152
00153 std::string ChronoEntity::format
00154 ( const double total ,
00155 const double minimal ,
00156 const double mean ,
00157 const double rms ,
00158 const double maximal ,
00159 const unsigned long number ) const
00160 {
00162 const int buffer_size = 256 ;
00163 char buffer[buffer_size] ;
00164 int index = 0 ;
00166 long double unit = 1.0 ;
00167 std::string cunit = "" ;
00169 if ( total / microsecond < 500 )
00170 { unit = microsecond ; cunit = " [us]" ; }
00171 else if( total / millisecond < 500 )
00172 { unit = millisecond ; cunit = " [ms]" ; }
00173 else if( total / second < 500 )
00174 { unit = second ; cunit = " [s]" ; }
00175 else if( total / minute < 500 )
00176 { unit = minute ; cunit = "[min]" ; }
00177 else if( total / hour < 500 )
00178 { unit = hour ; cunit = " [h]" ; }
00179 else if( total / day < 10 )
00180 { unit = day ; cunit = "[day]" ; }
00181 else if( total / week < 5 )
00182 { unit = week ; cunit = " [w]" ; }
00183 else if( total / month < 20 )
00184 { unit = month ; cunit = "[mon]" ; }
00185 else
00186 { unit = year ; cunit = " [y]" ; }
00188 index += sprintf( buffer + index , "Tot=%5.3g" , (double) (total / unit) ) ;
00189 index += sprintf( buffer + index , "%s" , cunit.c_str() ) ;
00191 if( 1 < number )
00192 {
00193
00194 if ( mean / microsecond < 500 )
00195 { unit = microsecond ; cunit = " [us]" ; }
00196 else if( mean / millisecond < 500 )
00197 { unit = millisecond ; cunit = " [ms]" ; }
00198 else if( mean / second < 500 )
00199 { unit = second ; cunit = " [s]" ; }
00200 else if( mean / minute < 500 )
00201 { unit = minute ; cunit = "[min]" ; }
00202 else if( mean / hour < 500 )
00203 { unit = hour ; cunit = " [h]" ; }
00204 else if( mean / day < 10 )
00205 { unit = day ; cunit = "[day]" ; }
00206 else if( mean / week < 5 )
00207 { unit = week ; cunit = " [w]" ; }
00208 else if( mean / month < 20 )
00209 { unit = month ; cunit = "[mon]" ; }
00210 else
00211 { unit = year ; cunit = "[year]" ; }
00213 index +=
00214 sprintf( buffer + index ,
00215 " Ave/Min/Max=%5.3g" , (double) ( mean / unit ) ) ;
00216 index +=
00217 sprintf( buffer + index ,
00218 "(+-%5.3g)" , (double) ( rms / unit ) ) ;
00219 index +=
00220 sprintf( buffer + index ,
00221 "/%5.3g" , (double) ( minimal / unit ) ) ;
00222 index +=
00223 sprintf( buffer + index ,
00224 "/%5.3g" , (double) ( maximal / unit ) ) ;
00226 index += sprintf( buffer + index , "%s" , cunit.c_str() );
00228 }
00229 else
00230 { index += sprintf( buffer + index , "%44s" , " " ); }
00232 index += sprintf( buffer + index , " #=%3lu" , number );
00234 return std::string( buffer, 0 , index );
00236 }
00237
00238
00239
00240 bool ChronoEntity::operator<( const ChronoEntity& e ) const
00241 {
00242 return
00243 ( &e == this ) ? false :
00244 ( totalTime () < e.totalTime () ) ? true :
00245 ( totalTime () > e.totalTime () ) ? false :
00246 ( m_user < e.m_user ) ? true :
00247 ( e.m_user < m_user ) ? false :
00248 ( m_kernel < e.m_kernel ) ? true :
00249 ( e.m_kernel < m_kernel ) ? false :
00250 ( m_elapsed < e.m_elapsed ) ? true :
00251 ( e.m_elapsed < m_elapsed ) ? false : false ;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 std::string ChronoEntity::outputTime
00263 ( IChronoSvc::ChronoType typ ,
00264 const std::string& fmt ,
00265 System::TimeType unit ) const
00266 {
00267 boost::format _fmt ( fmt ) ;
00268
00269 using namespace boost::io ;
00270 _fmt.exceptions ( all_error_bits ^ ( too_many_args_bit | too_few_args_bit ) ) ;
00271
00272 double _unit = microsecond ;
00273 switch ( unit )
00274 {
00275 case System::Year : _unit = year ; break ;
00276 case System::Month : _unit = month ; break ;
00277 case System::Day : _unit = day ; break ;
00278 case System::Hour : _unit = hour ; break ;
00279 case System::Min : _unit = minute ; break ;
00280 case System::Sec : _unit = second ; break ;
00281 case System::milliSec : _unit = millisecond ; break ;
00282 case System::microSec : _unit = microsecond ; break ;
00283 case System::nanoSec : _unit = nanosecond ; break ;
00284 default : _unit = microsecond ; break ;
00285 }
00286
00287 const StatEntity* stat = &m_user;
00288 switch ( typ )
00289 {
00290 case IChronoSvc::USER : stat = &m_user ; break ;
00291 case IChronoSvc::KERNEL : stat = &m_kernel ; break ;
00292 case IChronoSvc::ELAPSED : stat = &m_elapsed ; break ;
00293 default : stat = &m_user ; break ;
00294 }
00295
00296 _fmt
00297 % ( stat -> nEntries () )
00298 % ( stat -> flag () / _unit )
00299 % ( stat -> flagMean () / _unit )
00300 % ( stat -> flagRMS () / _unit )
00301 % ( stat -> flagMeanErr () / _unit )
00302 % ( stat -> flagMin () / _unit )
00303 % ( stat -> flagMax () / _unit ) ;
00304
00305 return _fmt.str() ;
00306 }
00307
00308
00309
00310
00311