forked from TropicSapling/triforce
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlist_benchmark.cpp
More file actions
94 lines (81 loc) · 2.08 KB
/
list_benchmark.cpp
File metadata and controls
94 lines (81 loc) · 2.08 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
static void ListAccess(benchmark::State& state) {
char *arrc[257];
char arr[768];
arrc[0] = arr;
for(int i = 0; i < 256; i++) {
if(i % 2) {
*(unsigned short*) arrc[i] = 65535;
arrc[i + 1] = arrc[i] + 2;
} else {
*(unsigned int*) arrc[i] = 4294967295;
arrc[i + 1] = arrc[i] + 4;
}
}
// Code inside this loop is measured repeatedly
for (auto _ : state) {
unsigned short s = 0;
unsigned int integer = 0;
for(int i = 0; i < 256; i++) {
if(arrc[i + 1] - arrc[i] == 2) {
s += *(unsigned short*) arrc[i];
} else {
integer += *(unsigned int*) arrc[i];
}
}
// Make sure the variable is not optimized away by compiler
benchmark::DoNotOptimize(s);
benchmark::DoNotOptimize(integer);
}
}
// Register the function as a benchmark
BENCHMARK(ListAccess);
static void ListAccess2(benchmark::State& state) {
char arr[1024];
for(int i = 0; i < 1022; i++) {
if(i % 2) {
arr[i] = 2;
i++;
*((unsigned short*) (arr + i)) = 65535;
i++;
} else {
arr[i] = 4;
i++;
*((unsigned int*) (arr + i)) = 4294967295;
i += 3;
}
}
// Code inside this loop is measured repeatedly
for (auto _ : state) {
unsigned short s = 0;
unsigned int integer = 0;
for(int i = 0; i < 1022; i++) {
if(arr[i] == 2) {
i++;
s += *((unsigned short*) (arr + i));
i++;
} else {
i++;
integer += *((unsigned int*) (arr + i));
i += 3;
}
}
// Make sure the variable is not optimized away by compiler
benchmark::DoNotOptimize(s);
benchmark::DoNotOptimize(integer);
}
}
// Register the function as a benchmark
BENCHMARK(ListAccess2);
static void ArrayAccess(benchmark::State& state) {
// Code before the loop is not measured
int arr[256] = {1};
for (auto _ : state) {
unsigned int integer = 0;
for(int i = 0; i < 256; i++) {
integer += arr[i];
}
// Make sure the variable is not optimized away by compiler
benchmark::DoNotOptimize(integer);
}
}
BENCHMARK(ArrayAccess);