![]() |
|
|
Generated: 18 Jul 2008 |
00001 // $Id: ChronoEntity.cpp,v 1.4 2008/06/06 13:20:13 marcocle Exp $ 00002 // ============================================================================ 00003 #define GAUDIKERNEL_CHRONOENTITY_CPP 1 00004 // ============================================================================ 00005 // incldue files 00006 // ============================================================================ 00007 // STD & STL 00008 // ============================================================================ 00009 #include <iostream> 00010 #include <iomanip> 00011 #include <cmath> 00012 #include <algorithm> 00013 #include <cstdio> 00014 // ============================================================================ 00015 // GaudiKernel 00016 // ============================================================================ 00017 #include "GaudiKernel/Kernel.h" 00018 #include "GaudiKernel/System.h" 00019 #include "GaudiKernel/ChronoEntity.h" 00020 // ============================================================================ 00021 // Boost 00022 // ============================================================================ 00023 #include "boost/format.hpp" 00024 // ============================================================================ 00030 // ============================================================================ 00031 namespace 00032 { 00034 const System::TimeType MyUnit = System::microSec ; // unit here is microsecond 00036 const double microsecond = 1 ; // unit here is microsecond 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 // Constructor 00049 // ============================================================================ 00050 ChronoEntity::ChronoEntity() 00051 00052 : m_status ( IChronoSvc::UNKNOWN ) // current status 00054 , m_delta_user ( -1 ) // delta user time 00056 , m_delta_kernel ( -1 ) // delta kernel time 00058 , m_delta_elapsed ( -1 ) // delta elapsed time 00060 , m_start_user ( 0 ) // start for user 00062 , m_start_kernel ( 0 ) // start for kernel 00064 , m_start_elapsed ( 0 ) // start for elapsed 00065 {} 00066 // ============================================================================ 00067 // start the chrono 00068 // ============================================================================ 00069 IChronoSvc::ChronoStatus ChronoEntity::start() 00070 { 00071 if ( IChronoSvc::RUNNING == m_status ) { return m_status ; } 00072 // 00073 // following lines could be platform dependent! 00074 // 00075 // Store in object the measured times 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 // stop the chrono 00086 // ============================================================================ 00087 IChronoSvc::ChronoStatus ChronoEntity::stop() 00088 { 00089 if ( IChronoSvc::RUNNING != m_status ) { return m_status ; } 00090 00091 // following lines could be platform dependent! 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 // update the counters: 00098 00099 m_user += m_delta_user ; 00100 m_kernel += m_delta_kernel ; 00101 m_elapsed += m_delta_elapsed ; 00102 00103 // set new status 00104 00105 m_status = IChronoSvc::STOPPED; 00106 00107 return m_status ; 00108 } 00109 // ============================================================================ 00110 // print user time 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 // print system time 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 // print time 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 // print the chrono 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 // comparison operator 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 /* print the chrono according the format and units 00255 * @param typ the chrono type 00256 * @param fmt the format string 00257 * @param unit the unit 00258 * @return the string representations 00259 * @see boost::format 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 // allow various number of arguments 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 () ) // %1 : #entries 00298 % ( stat -> flag () / _unit ) // %2 : total time 00299 % ( stat -> flagMean () / _unit ) // %3 : mean time 00300 % ( stat -> flagRMS () / _unit ) // %4 : RMS time 00301 % ( stat -> flagMeanErr () / _unit ) // %5 : error in mean time 00302 % ( stat -> flagMin () / _unit ) // %6 : minimal time 00303 % ( stat -> flagMax () / _unit ) ; // %7 : maximal time 00304 // 00305 return _fmt.str() ; 00306 } 00307 // ========================================================================== 00308 00309 // ============================================================================ 00310 // The END 00311 // ============================================================================