-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtimer.h
More file actions
131 lines (99 loc) · 3.92 KB
/
timer.h
File metadata and controls
131 lines (99 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#ifndef TIMER_H
#define TIMER_H
#include <ctime>
#include <iostream>
#include <iomanip>
class timer
{
friend std::ostream& operator<<(std::ostream& os, timer& t);
private:
bool running;
clock_t start_clock;
time_t start_time;
double acc_time;
double elapsed_time();
public:
// 'running' is initially false. A timer needs to be explicitly started
// using 'start' or 'restart'
timer() : running(false), start_clock(0), start_time(0), acc_time(0) { }
void start(const char* msg = 0);
void restart(const char* msg = 0);
void stop(const char* msg = 0);
void check(const char* msg = 0);
}; // class timer
//===========================================================================
// Return the total time that the timer has been in the "running"
// state since it was first "started" or last "restarted". For
// "short" time periods (less than an hour), the actual cpu time
// used is reported instead of the elapsed time.
inline double timer::elapsed_time()
{
time_t acc_sec = time(0) - start_time;
if (acc_sec < 3600)
return (clock() - start_clock) / (1.0 *CLOCKS_PER_SEC);
else
return (1.0 * acc_sec);
} // timer::elapsed_time
//===========================================================================
// Start a timer. If it is already running, let it continue running.
// Print an optional message.
inline void timer::start(const char* msg)
{
// Print an optional message, something like "Starting timer t";
if (msg) std::cout << msg << std::endl;
// Return immediately if the timer is already running
if (running) return;
// Set timer status to running and set the start time
running = true;
start_clock = clock();
start_time = time(0);
} // timer::start
//===========================================================================
// Turn the timer off and start it again from 0. Print an optional message.
inline void timer::restart(const char* msg)
{
// Print an optional message, something like "Restarting timer t";
if (msg) std::cout << msg << std::endl;
// Set timer status to running, reset accumulated time, and set start time
running = true;
acc_time = 0;
start_clock = clock();
start_time = time(0);
} // timer::restart
//===========================================================================
// Stop the timer and print an optional message.
inline void timer::stop(const char* msg)
{
// Print an optional message, something like "Stopping timer t";
if (msg) std::cout << msg << std::endl;
// Compute accumulated running time and set timer status to not running
if (running) acc_time += elapsed_time();
running = false;
} // timer::stop
//===========================================================================
// Print out an optional message followed by the current timer timing.
inline void timer::check(const char* msg)
{
// Print an optional message, something like "Checking timer t";
if (msg) std::cout << msg << " : ";
std::cout << "Elapsed time: ";
std::cout << int(acc_time + (running ? elapsed_time() : 0)) / (60 * 60 * 24) ;
std::cout << " d ";
std::cout << int(acc_time + (running ? elapsed_time() : 0)) / (60 * 60) % 24;
std::cout << " h ";
std::cout << int(acc_time + (running ? elapsed_time() : 0)) / 60 % 60 ;
std::cout << " m ";
std::cout << int(acc_time + (running ? elapsed_time() : 0)) % 60;
std::cout << " s [" << acc_time + (running ? elapsed_time() : 0) << " sec.]" <<std::endl;
} // timer::check
//===========================================================================
// Allow timers to be printed to ostreams using the syntax 'os << t'
// for an ostream 'os' and a timer 't'. For example, "cout << t" will
// print out the total amount of time 't' has been "running".
inline std::ostream& operator<<(std::ostream& os, timer& t)
{
os << t.acc_time + (t.running ? t.elapsed_time() : 0);
return os;
}
//===========================================================================
#endif // TIMER_H