/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Utilities/BesTimerSvc/BesTimerSvc-00-00-12/src/BesTimer.cxx

Go to the documentation of this file.
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     }

Generated on Tue Nov 29 23:14:42 2016 for BOSS_7.0.2 by  doxygen 1.4.7