00001 #include <iostream>
00002 #include <iomanip>
00003 #include <strstream>
00004 #include <cmath>
00005 #include <algorithm>
00006
00007
00008
00009 #include "GaudiKernel/Kernel.h"
00010 #include "GaudiKernel/System.h"
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "ChronoEntity.h"
00021
00022
00023
00024
00025
00026 ChronoEntity::ChronoEntity()
00028 : m_ce_currentStatus ( IChronoStatSvc::UNKNOWN )
00030 , m_ce_noOfMeasurements ( 0 )
00032 , m_ce_minimalUserTime ( 1000000000 )
00034 , m_ce_minimalKernelTime ( 1000000000 )
00036 , m_ce_minimalEllapsedTime ( 1000000000 )
00038 , m_ce_maximalUserTime ( 0 )
00040 , m_ce_maximalKernelTime ( 0 )
00042 , m_ce_maximalEllapsedTime ( 0 )
00044 , m_ce_totalUserTime ( 0 )
00046 , m_ce_totalKernelTime ( 0 )
00048 , m_ce_totalEllapsedTime ( 0 )
00050 , m_ce_statisticsForUserTime ( 0 )
00052 , m_ce_statisticsForKernelTime ( 0 )
00054 , m_ce_statisticsForEllapsedTime ( 0 )
00056 , m_ce_startOfCurrentMeasurementOfUserTime ( 0 )
00058 , m_ce_startOfCurrentMeasurementOfKernelTime ( 0 )
00060 , m_ce_startOfCurrentMeasurementOfEllapsedTime ( 0 )
00061 {};
00062
00063
00064
00068 IChronoStatSvc::ChronoStatus ChronoEntity::start()
00069 {
00070 if ( IChronoStatSvc::RUNNING == status() ) { return status() ; }
00076
00077 m_ce_startOfCurrentMeasurementOfUserTime = System::userTime ( System::microSec );
00078 m_ce_startOfCurrentMeasurementOfKernelTime = System::kernelTime ( System::microSec );
00079 m_ce_startOfCurrentMeasurementOfEllapsedTime = System::ellapsedTime ( System::microSec );
00082 m_ce_currentStatus = IChronoStatSvc::RUNNING;
00084 return status();
00085 };
00086
00087
00088
00089
00090
00091 IChronoStatSvc::ChronoStatus ChronoEntity::stop()
00092 {
00093 if( IChronoStatSvc::RUNNING != status() ) { return status(); }
00094
00101 time_type deltaUser = System::userTime ( System::microSec ) -
00102 m_ce_startOfCurrentMeasurementOfUserTime ;
00104 time_type deltaKernel = System::kernelTime ( System::microSec ) -
00105 m_ce_startOfCurrentMeasurementOfKernelTime ;
00107 time_type deltaEllapsed = System::ellapsedTime( System::microSec ) -
00108 m_ce_startOfCurrentMeasurementOfEllapsedTime ;
00116 ++m_ce_noOfMeasurements;
00119 m_ce_minimalUserTime = ( deltaUser < m_ce_minimalUserTime ) ? deltaUser : m_ce_minimalUserTime ;
00122 m_ce_minimalKernelTime = ( deltaKernel < m_ce_minimalKernelTime ) ? deltaKernel : m_ce_minimalKernelTime ;
00125 m_ce_minimalEllapsedTime = ( deltaEllapsed < m_ce_minimalEllapsedTime ) ? deltaEllapsed : m_ce_minimalEllapsedTime ;
00128 m_ce_maximalUserTime = ( deltaUser > m_ce_maximalUserTime ) ? deltaUser : m_ce_maximalUserTime ;
00131 m_ce_maximalKernelTime = ( deltaKernel > m_ce_maximalKernelTime ) ? deltaKernel : m_ce_maximalKernelTime ;
00134 m_ce_maximalEllapsedTime = ( deltaEllapsed > m_ce_maximalEllapsedTime ) ? deltaEllapsed : m_ce_maximalEllapsedTime ;
00137 m_ce_totalUserTime += deltaUser ;
00140 m_ce_totalKernelTime += deltaKernel ;
00143 m_ce_totalEllapsedTime += deltaEllapsed ;
00146 m_ce_statisticsForUserTime += deltaUser * deltaUser ;
00149 m_ce_statisticsForKernelTime += deltaKernel * deltaKernel ;
00152 m_ce_statisticsForEllapsedTime += deltaEllapsed * deltaEllapsed ;
00155 m_ce_currentStatus = IChronoStatSvc::STOPPED;
00157 return status();
00158 };
00159
00163 std::string ChronoEntity::format( long double total ,
00164 long double minimal ,
00165 long double mean ,
00166 long double rms ,
00167 long double maximal ,
00168 unsigned long number ) const
00169 {
00170
00174 long double microsecond = 1.0 ;
00175 long double millisecond = 1000 * microsecond ;
00176 long double second = 1000 * millisecond ;
00177 long double minute = 60 * second ;
00178 long double hour = 60 * minute ;
00179 long double day = 24 * hour ;
00180 long double week = 7 * day ;
00181 long double month = 30 * day ;
00182 long double year = 365 * day ;
00183
00187 const int buffer_size = 1024;
00188 char buffer[ buffer_size ] = { 0 , 0 };
00189 std::ostrstream ost(buffer, buffer_size);
00191 long double unit = 1.0 ;
00192 std::string cunit = "" ;
00194 if ( total / microsecond < 100 ) { unit = microsecond ; cunit = " [us]" ; }
00195 else if( total / millisecond < 100 ) { unit = millisecond ; cunit = " [ms]" ; }
00196 else if( total / second < 100 ) { unit = second ; cunit = " [s]" ; }
00197 else if( total / minute < 100 ) { unit = minute ; cunit = "[min]" ; }
00198 else if( total / hour < 100 ) { unit = hour ; cunit = " [h]" ; }
00199 else if( total / day < 10 ) { unit = day ; cunit = "[day]" ; }
00200 else if( total / week < 5 ) { unit = week ; cunit = "[week]" ; }
00201 else if( total / month < 20 ) { unit = month ; cunit = "[month]" ; }
00202 else { unit = year ; cunit = "[year]" ; }
00204 ost << "Tot=" << std::setw(5) << std::setprecision(3) << total / unit << cunit ;
00206 if( 1 < number )
00207 {
00210 if ( mean / microsecond < 100 ) { unit = microsecond ; cunit = " [us]" ; }
00211 else if( mean / millisecond < 100 ) { unit = millisecond ; cunit = " [ms]" ; }
00212 else if( mean / second < 100 ) { unit = second ; cunit = " [s]" ; }
00213 else if( mean / minute < 100 ) { unit = minute ; cunit = "[min]" ; }
00214 else if( mean / hour < 100 ) { unit = hour ; cunit = " [h]" ; }
00215 else if( mean / day < 10 ) { unit = day ; cunit = "[day]" ; }
00216 else if( mean / week < 5 ) { unit = week ; cunit = "[week]" ; }
00217 else if( mean / month < 20 ) { unit = month ; cunit = "[month]" ; }
00218 else { unit = year ; cunit = " [year]" ; }
00220 if( 0 == rms || minimal == maximal )
00221 { ost << "\tMean= " << std::setw(5) << std::setprecision(3) << mean / unit; }
00222 else
00223 {
00224 ost << "\tMean=" << std::setw(5) << std::setprecision(3) << mean / unit
00225 << "+-" << std::setw(4) << std::setprecision(2) << rms / unit
00226 << "\tMin=" << std::setw(4) << std::setprecision(2) << minimal / unit
00227 << "\tMax=" << std::setw(4) << std::setprecision(2) << maximal / unit ;
00228 }
00230 ost << " " << cunit;
00232 ost << "\t(#=" << number << ")";
00233 }
00236 std::string res;
00237 res += ost.str();
00239 return res;
00241 };
00242
00243
00244
00245
00246
00247
00248
00249