-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtimerUtil.h
More file actions
131 lines (109 loc) · 3.46 KB
/
timerUtil.h
File metadata and controls
131 lines (109 loc) · 3.46 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
// Steven Farago
// Drew Lamar
//
// Numerical Analysis -- Linear Algebra
// Final Project
//
//
// Defines the TimerUtil class. Used in the main code to determine the
// runtime of the parser.
//
#include <unistd.h>
#include <iostream>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
using namespace std;
class TimerUtil {
private:
timeval startTime;
timeval stopTime;
long sec;
long microsec;
timeval usrStartTime, sysStartTime;
public:
// Note: constructor automatically sets start time
TimerUtil() {
setStartTime();
}
// Call this at the time you wish to start timing.
void setStartTime() {
sec = microsec = 0;
gettimeofday(&startTime, NULL);
struct rusage r_usage;
getrusage(RUSAGE_SELF, &r_usage);
usrStartTime.tv_sec = r_usage.ru_utime.tv_sec;
usrStartTime.tv_usec = r_usage.ru_utime.tv_usec;
sysStartTime.tv_sec = r_usage.ru_stime.tv_sec;
sysStartTime.tv_usec = r_usage.ru_stime.tv_usec;
}
// Call this at the time you wish to end timing.
void setStopTime() {
gettimeofday(&stopTime, NULL);
sec = stopTime.tv_sec - startTime.tv_sec;
microsec = stopTime.tv_usec - startTime.tv_usec;
if (microsec < 0) {
microsec+=1000000;
sec--;
}
}
void setStopTime(ostream& os, const char* notes) {
struct rusage r_usage;
getrusage(RUSAGE_SELF, &r_usage);
long usec = r_usage.ru_utime.tv_sec - usrStartTime.tv_sec;
long umsec = r_usage.ru_utime.tv_usec - usrStartTime.tv_usec;
if (umsec < 0) {
umsec += 1000000;
usec--;
}
long ssec = r_usage.ru_stime.tv_sec - sysStartTime.tv_sec;
long smsec = r_usage.ru_stime.tv_usec - sysStartTime.tv_usec;
if (smsec < 0) {
smsec += 1000000;
ssec--;
}
setStopTime();
os << notes << endl;
os << "CPU Usage: user = " << usec
<< " seconds " << umsec << " us, system = " << ssec
<< " seconds " << smsec << "us" << endl;
os << "ELAPSED Time: " << sec << " seconds "
<< microsec << " us" << endl;
}
void setStopTime(ostream& os, const char* notes, const int iter) {
struct rusage r_usage;
getrusage(RUSAGE_SELF, &r_usage);
long usec = r_usage.ru_utime.tv_sec - usrStartTime.tv_sec;
long umsec = r_usage.ru_utime.tv_usec - usrStartTime.tv_usec;
if (umsec < 0) {
umsec += 1000000;
usec--;
}
long ssec = r_usage.ru_stime.tv_sec - sysStartTime.tv_sec;
long smsec = r_usage.ru_stime.tv_usec - sysStartTime.tv_usec;
if (smsec < 0) {
smsec += 1000000;
ssec--;
}
setStopTime();
os << notes << endl;
os << "CPU Usage: user = " << usec
<< " seconds " << umsec << " us, system = " << ssec
<< " seconds " << smsec << "us" << endl;
os << "Time per iteration = "<<(usec+umsec/1e6)/iter<<endl;
os << "ELAPSED Time: " << sec << " seconds "
<< microsec << " us" << endl;
}
void getTotalElapsedSec(ostream & os){
struct rusage r_usage;
getrusage(RUSAGE_SELF, &r_usage);
os << "CPU Usage: user = " << r_usage.ru_utime.tv_sec
<< " seconds " << r_usage.ru_utime.tv_usec << " us, system = " << r_usage.ru_stime.tv_sec
<< " seconds " << r_usage.ru_stime.tv_usec << "us" << endl;
}
// Returns the seconds between calls to setStartTime and setEndTime
long getElapsedSec() {return sec;}
// Returns any extra microseconds after taking to account elapsed
// seconds
long getElapsedMicrosec() {return microsec;}
};