-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathtiming.h
139 lines (125 loc) · 3.13 KB
/
timing.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
130
131
132
133
134
135
136
137
138
139
#ifndef __timing_h__
#define __timing_h__ 1
#include <math.h>
#include <algorithm> // For std::sort
#include <iostream>
#include <fstream>
const double unit=1.0e-9; // default unit is 1 nanosecond
enum timing_algorithm {WRITETOFILE = -1, MEDIAN, MEAN, MIN, MAX, P90, P80, P50};
inline double median(double *T, size_t N) // TODO: Replace with selection algorithm
{
std::sort(T,T+N);
size_t h=N/2;
return 2*h == N ? 0.5*(T[h-1]+T[h]) : T[h];
}
inline double value(double *T, size_t N, int algorithm)
{
switch(algorithm) {
case WRITETOFILE:
case MEDIAN:
return median(T,N);
case MEAN: {
double sum=0.0;
for(size_t i=0; i < N; ++i)
sum += T[i];
return sum/N;
}
case MIN: {
double min=T[0];
for(size_t i=0; i < N; ++i) {
if(T[i] < min)
min=T[i];
}
return min;
}
case MAX: {
double max=T[0];
for(size_t i=0; i < N; ++i) {
if(T[i] > max)
max=T[i];
}
return max;
}
case P90: {
std::sort(T,T+N);
size_t start=(size_t) ceil(N*0.05);
size_t stop=(size_t) floor(N*0.95);
double sum=0.0;
for(size_t i=start; i < stop; ++i)
sum += T[i];
return sum/(stop-start);
}
case P80: {
std::sort(T,T+N);
size_t start=(size_t) ceil(N*0.1);
size_t stop=(size_t) floor(N*0.9);
double sum=0.0;
for(size_t i=start; i < stop; ++i)
sum += T[i];
return sum/(stop-start);
}
case P50: {
std::sort(T,T+N);
size_t start=(size_t) ceil(N*0.25);
size_t stop=(size_t) floor(N*0.75);
double sum=0.0;
for(size_t i=start; i < stop; ++i)
sum += T[i];
return sum/(stop-start);
}
default:
std::cout << "Error: invalid algorithm choice: "
<< algorithm
<< std::endl;
exit(1);
}
return 0;
}
inline void stdev(double *T, size_t N,
double &lower, double& upper,
int algorithm)
{
lower=0.0, upper=0.0;
double sum=0.0;
for(size_t i=0; i < N; ++i)
sum += T[i];
double mean=sum/N;
for(size_t i=0; i < N; ++i) {
double v=T[i]-mean;
if(v < 0)
lower += v*v;
if(v > 0)
upper += v*v;
}
double factor=N > 2 ? 2.0/(N-2.0) : 0.0;
lower=mean-sqrt(lower*factor);
upper=mean+sqrt(upper*factor);
}
inline void timings(const char* text, size_t m, size_t count,
double value, double lower, double upper)
{
std::cout << text << ":\n"
<< m << "\t"
<< value << "\t"
<< lower << "\t"
<< upper
<< std::endl;
}
inline void timings(const char* text, size_t m, double *T,
size_t N, int algorithm=MEDIAN)
{
double lower=0.0, upper=0.0;
if(algorithm == WRITETOFILE) {
std::ofstream myfile;
myfile.open("timing.dat", std::fstream::app);
myfile << m << "\t";
myfile << N << "\t";
for(size_t i=0; i < N; ++i)
myfile << T[i]*unit << "\t";
myfile << "\n";
}
double avg=value(T,N,algorithm)*unit;
stdev(T,N,lower,upper,algorithm);
timings(text,m,N,avg,lower*unit,upper*unit);
}
#endif