00001 00002 00003 // this is -*- c++ -*- 00004 // $Id: BesTimer.cxx,v 1.4 2011/02/18 04:23:58 maqm Exp $ 00005 // $Name: BesTimerSvc-00-00-12 $ 00006 #include <sys/time.h> 00007 #include <complex> 00008 00009 #include "BesTimerSvc/BesTimer.h" 00010 00011 #define SecsInDay 86400 00012 00013 BesTimer::BesTimer (const std::string name) 00014 : m_name (name) { 00015 m_numberOfMeasurements = 0; 00016 m_mean = 0.0; 00017 m_ms = 0.0; 00018 m_elapsed = 0.0; 00019 m_started=false; 00020 m_paused=false; 00021 m_propVal = 0; 00022 m_meanVal = 0; 00023 m_meanTimePerObject = 0.0; 00024 m_NmeanTimePerObject = 0; 00025 } 00026 00027 void BesTimer::start( void ) { 00028 struct timeval tv; 00029 00030 m_started = true; 00031 m_paused = false; 00032 m_elapsed = 0.0; 00033 m_propVal = 0; 00034 // if already started, the start time will be over-written 00035 gettimeofday(&tv, 0); 00036 m_startTime = tv; 00037 } 00038 00039 void BesTimer::stop ( void ) { 00040 struct timeval tv; 00041 00042 if (!m_started) return; 00043 00044 gettimeofday(&tv, 0); 00045 m_started = false; 00046 00047 if (!m_paused) { 00048 float mtime; 00049 int secs, usecs; 00050 00051 if (tv.tv_sec >= m_startTime.tv_sec) { 00052 secs = tv.tv_sec - m_startTime.tv_sec; 00053 } else { 00054 secs = tv.tv_sec - m_startTime.tv_sec + SecsInDay; 00055 } 00056 usecs = tv.tv_usec - m_startTime.tv_usec; 00057 mtime = static_cast<float>(secs)*1000. + static_cast<float>(usecs)/1000.; 00058 00059 // elapsed time 00060 m_elapsed += mtime; 00061 00062 } 00063 00064 // statistics - mean, rms 00065 double denom = static_cast <double> (++m_numberOfMeasurements); 00066 double d = m_elapsed - m_mean; 00067 m_mean += d / denom; 00068 double dd = m_elapsed*m_elapsed - m_ms; 00069 m_ms += dd / denom; 00070 00071 // mean property 00072 m_meanVal += static_cast <double> (m_propVal - m_meanVal) / denom; 00073 if (m_propVal !=0) { 00074 double timePerObject = m_elapsed/static_cast <double>(m_propVal); 00075 m_meanTimePerObject += static_cast <double> (timePerObject - m_meanTimePerObject) / 00076 static_cast<double> (++m_NmeanTimePerObject); 00077 } 00078 } 00079 00080 void BesTimer::pause ( void ) { 00081 struct timeval tv; 00082 00083 // only pause if started 00084 // a pause while paused is ignored 00085 if (m_paused || !m_started) return; 00086 m_paused = true; 00087 gettimeofday(&tv, 0); 00088 00089 float mtime; 00090 int secs, usecs; 00091 00092 if (tv.tv_sec >= m_startTime.tv_sec) { 00093 secs = tv.tv_sec - m_startTime.tv_sec; 00094 } else { 00095 secs = tv.tv_sec - m_startTime.tv_sec + SecsInDay; 00096 } 00097 usecs = tv.tv_usec - m_startTime.tv_usec; 00098 mtime = static_cast<float>(secs)*1000. + static_cast<float>(usecs)/1000.; 00099 m_elapsed += mtime; // time so far 00100 } 00101 00102 void BesTimer::resume( void ) { 00103 struct timeval tv; 00104 00105 if (!m_started) { 00106 start(); // resume acts as start if not started 00107 } else if (m_paused) { 00108 m_paused = false; 00109 gettimeofday(&tv, 0); 00110 m_startTime = tv; 00111 } 00112 } 00113 00114 void BesTimer::reset () { 00115 if (!m_started) { 00116 m_elapsed = 0.0; 00117 m_propVal = 0; 00118 } 00119 }