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 #ifdef __ICC
00070
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
00079
00080
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
00091 #pragma warning(pop)
00092 #endif
00093
00094
00095
00096 IChronoSvc::ChronoStatus ChronoEntity::stop()
00097 {
00098 if ( IChronoSvc::RUNNING != m_status ) { return m_status ; }
00099
00100
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
00107
00108 m_user += m_delta_user ;
00109 m_kernel += m_delta_kernel ;
00110 m_elapsed += m_delta_elapsed ;
00111
00112
00113
00114 m_status = IChronoSvc::STOPPED;
00115
00116 return m_status ;
00117 }
00118
00119
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
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
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
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 {
00171 const int buffer_size = 256 ;
00172 char buffer[buffer_size] ;
00173 int index = 0 ;
00175 long double unit = 1.0 ;
00176 std::string cunit = "" ;
00178 if ( total / microsecond < 500 )
00179 { unit = microsecond ; cunit = " [us]" ; }
00180 else if( total / millisecond < 500 )
00181 { unit = millisecond ; cunit = " [ms]" ; }
00182 else if( total / second < 500 )
00183 { unit = second ; cunit = " [s]" ; }
00184 else if( total / minute < 500 )
00185 { unit = minute ; cunit = "[min]" ; }
00186 else if( total / hour < 500 )
00187 { unit = hour ; cunit = " [h]" ; }
00188 else if( total / day < 10 )
00189 { unit = day ; cunit = "[day]" ; }
00190 else if( total / week < 5 )
00191 { unit = week ; cunit = " [w]" ; }
00192 else if( total / month < 20 )
00193 { unit = month ; cunit = "[mon]" ; }
00194 else
00195 { unit = year ; cunit = " [y]" ; }
00197 index += sprintf( buffer + index , "Tot=%5.3g" , (double) (total / unit) ) ;
00198 index += sprintf( buffer + index , "%s" , cunit.c_str() ) ;
00200 if( 1 < number )
00201 {
00202
00203 if ( mean / microsecond < 500 )
00204 { unit = microsecond ; cunit = " [us]" ; }
00205 else if( mean / millisecond < 500 )
00206 { unit = millisecond ; cunit = " [ms]" ; }
00207 else if( mean / second < 500 )
00208 { unit = second ; cunit = " [s]" ; }
00209 else if( mean / minute < 500 )
00210 { unit = minute ; cunit = "[min]" ; }
00211 else if( mean / hour < 500 )
00212 { unit = hour ; cunit = " [h]" ; }
00213 else if( mean / day < 10 )
00214 { unit = day ; cunit = "[day]" ; }
00215 else if( mean / week < 5 )
00216 { unit = week ; cunit = " [w]" ; }
00217 else if( mean / month < 20 )
00218 { unit = month ; cunit = "[mon]" ; }
00219 else
00220 { unit = year ; cunit = "[year]" ; }
00222 index +=
00223 sprintf( buffer + index ,
00224 " Ave/Min/Max=%5.3g" , (double) ( mean / unit ) ) ;
00225 index +=
00226 sprintf( buffer + index ,
00227 "(+-%5.3g)" , (double) ( rms / unit ) ) ;
00228 index +=
00229 sprintf( buffer + index ,
00230 "/%5.3g" , (double) ( minimal / unit ) ) ;
00231 index +=
00232 sprintf( buffer + index ,
00233 "/%5.3g" , (double) ( maximal / unit ) ) ;
00235 index += sprintf( buffer + index , "%s" , cunit.c_str() );
00237 }
00238 else
00239 { index += sprintf( buffer + index , "%44s" , " " ); }
00241 index += sprintf( buffer + index , " #=%3lu" , number );
00243 return std::string( buffer, 0 , index );
00245 }
00246
00247
00248
00249 bool ChronoEntity::operator<( const ChronoEntity& e ) const
00250 {
00251 return
00252 ( &e == this ) ? false :
00253 ( totalTime () < e.totalTime () ) ? true :
00254 ( totalTime () > e.totalTime () ) ? false :
00255 ( m_user < e.m_user ) ? true :
00256 ( e.m_user < m_user ) ? false :
00257 ( m_kernel < e.m_kernel ) ? true :
00258 ( e.m_kernel < m_kernel ) ? false :
00259 ( m_elapsed < e.m_elapsed ) ? true :
00260 ( e.m_elapsed < m_elapsed ) ? false : false ;
00261 }
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271 std::string ChronoEntity::outputTime
00272 ( IChronoSvc::ChronoType typ ,
00273 const std::string& fmt ,
00274 System::TimeType unit ) const
00275 {
00276 boost::format _fmt ( fmt ) ;
00277
00278 using namespace boost::io ;
00279 _fmt.exceptions ( all_error_bits ^ ( too_many_args_bit | too_few_args_bit ) ) ;
00280
00281 double _unit = microsecond ;
00282 switch ( unit )
00283 {
00284 case System::Year : _unit = year ; break ;
00285 case System::Month : _unit = month ; break ;
00286 case System::Day : _unit = day ; break ;
00287 case System::Hour : _unit = hour ; break ;
00288 case System::Min : _unit = minute ; break ;
00289 case System::Sec : _unit = second ; break ;
00290 case System::milliSec : _unit = millisecond ; break ;
00291 case System::microSec : _unit = microsecond ; break ;
00292 case System::nanoSec : _unit = nanosecond ; break ;
00293 default : _unit = microsecond ; break ;
00294 }
00295
00296 const StatEntity* stat = &m_user;
00297 switch ( typ )
00298 {
00299 case IChronoSvc::USER : stat = &m_user ; break ;
00300 case IChronoSvc::KERNEL : stat = &m_kernel ; break ;
00301 case IChronoSvc::ELAPSED : stat = &m_elapsed ; break ;
00302 default : stat = &m_user ; break ;
00303 }
00304
00305 _fmt
00306 % ( stat -> nEntries () )
00307 % ( stat -> flag () / _unit )
00308 % ( stat -> flagMean () / _unit )
00309 % ( stat -> flagRMS () / _unit )
00310 % ( stat -> flagMeanErr () / _unit )
00311 % ( stat -> flagMin () / _unit )
00312 % ( stat -> flagMax () / _unit ) ;
00313
00314 return _fmt.str() ;
00315 }
00316
00317
00318
00319
00320