BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
BesTimer.cxx
Go to the documentation of this file.
1
2
3// this is -*- c++ -*-
4// $Id: BesTimer.cxx,v 1.5 2022/01/12 04:44:15 maqm Exp $
5// $Name: BesTimerSvc-00-01-00 $
6#include <complex>
7#include <sys/time.h>
8
9#include "BesTimerSvc/BesTimer.h"
10
11#define SecsInDay 86400
12
13BesTimer::BesTimer( const std::string name ) : m_name( name ) {
14 m_numberOfMeasurements = 0;
15 m_mean = 0.0;
16 m_ms = 0.0;
17 m_elapsed = 0.0;
18 m_started = false;
19 m_paused = false;
20 m_propVal = 0;
21 m_meanVal = 0;
22 m_meanTimePerObject = 0.0;
23 m_NmeanTimePerObject = 0;
24}
25
26void BesTimer::start( void ) {
27 struct timeval tv;
28
29 m_started = true;
30 m_paused = false;
31 m_elapsed = 0.0;
32 m_propVal = 0;
33 // if already started, the start time will be over-written
34 gettimeofday( &tv, 0 );
35 m_startTime = tv;
36}
37
38void BesTimer::stop( void ) {
39 struct timeval tv;
40
41 if ( !m_started ) return;
42
43 gettimeofday( &tv, 0 );
44 m_started = false;
45
46 if ( !m_paused )
47 {
48 float mtime;
49 int secs, usecs;
50
51 if ( tv.tv_sec >= m_startTime.tv_sec ) { secs = tv.tv_sec - m_startTime.tv_sec; }
52 else { secs = tv.tv_sec - m_startTime.tv_sec + SecsInDay; }
53 usecs = tv.tv_usec - m_startTime.tv_usec;
54 mtime = static_cast<float>( secs ) * 1000. + static_cast<float>( usecs ) / 1000.;
55
56 // elapsed time
57 m_elapsed += mtime;
58 }
59
60 // statistics - mean, rms
61 double denom = static_cast<double>( ++m_numberOfMeasurements );
62 double d = m_elapsed - m_mean;
63 m_mean += d / denom;
64 double dd = m_elapsed * m_elapsed - m_ms;
65 m_ms += dd / denom;
66
67 // mean property
68 m_meanVal += static_cast<double>( m_propVal - m_meanVal ) / denom;
69 if ( m_propVal != 0 )
70 {
71 double timePerObject = m_elapsed / static_cast<double>( m_propVal );
72 m_meanTimePerObject += static_cast<double>( timePerObject - m_meanTimePerObject ) /
73 static_cast<double>( ++m_NmeanTimePerObject );
74 }
75}
76
77void BesTimer::pause( void ) {
78 struct timeval tv;
79
80 // only pause if started
81 // a pause while paused is ignored
82 if ( m_paused || !m_started ) return;
83 m_paused = true;
84 gettimeofday( &tv, 0 );
85
86 float mtime;
87 int secs, usecs;
88
89 if ( tv.tv_sec >= m_startTime.tv_sec ) { secs = tv.tv_sec - m_startTime.tv_sec; }
90 else { secs = tv.tv_sec - m_startTime.tv_sec + SecsInDay; }
91 usecs = tv.tv_usec - m_startTime.tv_usec;
92 mtime = static_cast<float>( secs ) * 1000. + static_cast<float>( usecs ) / 1000.;
93 m_elapsed += mtime; // time so far
94}
95
96void BesTimer::resume( void ) {
97 struct timeval tv;
98
99 if ( !m_started )
100 {
101 start(); // resume acts as start if not started
102 }
103 else if ( m_paused )
104 {
105 m_paused = false;
106 gettimeofday( &tv, 0 );
107 m_startTime = tv;
108 }
109}
110
112 if ( !m_started )
113 {
114 m_elapsed = 0.0;
115 m_propVal = 0;
116 }
117}
#define SecsInDay
Definition BesTimer.cxx:11
void pause(void)
Definition BesTimer.cxx:77
void reset()
Definition BesTimer.cxx:111
BesTimer(const std::string name)
Definition BesTimer.cxx:13
void resume(void)
Definition BesTimer.cxx:96
void start(void)
Definition BesTimer.cxx:26
void stop(void)
Definition BesTimer.cxx:38