Go to the documentation of this file.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()
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 {
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
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
00248
00249
00250
00251
00252
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
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 () )
00291 % ( stat -> flag () / _unit )
00292 % ( stat -> flagMean () / _unit )
00293 % ( stat -> flagRMS () / _unit )
00294 % ( stat -> flagMeanErr () / _unit )
00295 % ( stat -> flagMin () / _unit )
00296 % ( stat -> flagMax () / _unit ) ;
00297
00298 return _fmt.str() ;
00299 }
00300
00301
00302
00303
00304