forked from valeriu-balaban/app-evision
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtracer.h
129 lines (100 loc) · 3.08 KB
/
tracer.h
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
#ifndef TRACER_H
#define TRACER_H
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
#include <time.h>
#define TRACER_CLOCK CLOCK_THREAD_CPUTIME_ID
class Tracer{
// Private struct
struct Event{
std::string name;
long long min;
long long max;
long long total;
long count;
};
// Private variables
std::vector<Event> event_list;
timespec start_time;
public:
Tracer():event_list(0){};
void start(){
clock_gettime(TRACER_CLOCK, &start_time);
}
void event(std::string name){
std::vector<Event>::iterator i;
timespec event_time;
long elapsed_time;
clock_gettime(TRACER_CLOCK, &event_time);
if(event_time.tv_nsec < start_time.tv_nsec){
// wrong returned time
return ;
} else {
elapsed_time = event_time.tv_nsec - start_time.tv_nsec;
}
// find name in list
for (i = event_list.begin(); i != event_list.end(); ++i) {
if (i->name == name) {
// update values
if(i->min > elapsed_time){
i->min = elapsed_time;
}
if(i->max < elapsed_time){
i->max = elapsed_time;
}
i->total += elapsed_time;
i->count++;
break;
}
}
// append event if not in the list
if(i == event_list.end()){
Event new_event;
new_event.name = name;
new_event.min = elapsed_time;
new_event.max = elapsed_time;
new_event.total = elapsed_time;
new_event.count = 1;
event_list.insert(event_list.end(), new_event);
}
clock_gettime(TRACER_CLOCK, &start_time);
}
void end(){
std::vector<Event>::iterator i;
long total_min = 0, total_max = 0, total_avg = 0;
std::cout << std::setfill('-') << std::setw(73) << "-" << std::endl;
std::cout << std::setfill(' ');
std::cout << "|" ;
std::cout << std::setw(20) << "Event Name" << " |";
std::cout << std::setw(15) << "Min Time [us]" << " |";
std::cout << std::setw(15) << "Max Time [us]" << " |";
std::cout << std::setw(15) << "Avg Time [us]" << " |";
std::cout << std::endl;
std::cout << std::setfill('-') << std::setw(73) << "-" << std::endl;
std::cout << std::setfill(' ');
for (i = event_list.begin(); i != event_list.end(); ++i){
std::cout << "|" ;
std::cout << std::setw(20) << i->name << " |";
std::cout << std::setw(15) << i->min / 1000 << " |";
std::cout << std::setw(15) << i->max / 1000 << " |";
std::cout << std::setw(15) << (i->total / i->count) / 1000 << " |";
std::cout << std::endl;
total_min += i->min / 1000;
total_max += i->max / 1000;
total_avg += (i->total / i->count) / 1000;
}
std::cout << std::setfill('-') << std::setw(73) << "-" << std::endl;
std::cout << std::setfill(' ');
std::cout << "|" ;
std::cout << std::setw(20) << "Total" << " |";
std::cout << std::setw(15) << total_min << " |";
std::cout << std::setw(15) << total_max << " |";
std::cout << std::setw(15) << total_avg << " |";
std::cout << std::endl;
std::cout << std::setfill('-') << std::setw(73) << "-" << std::endl;
std::cout << std::setfill(' ');
}
};
#endif