-
Notifications
You must be signed in to change notification settings - Fork 0
/
branch-prediction.cpp
51 lines (46 loc) · 1.45 KB
/
branch-prediction.cpp
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
#include <vector>
#include <random>
#include <algorithm>
#include <benchmark/benchmark.h>
std::vector<std::uint8_t> getRandomVector(int numElements) {
std::vector<uint8_t> listOfNumbers;
listOfNumbers.reserve(numElements);
std::random_device r;
std::mt19937 mersenneTwister(r());
std::uniform_int_distribution<uint8_t> d(0);
for (int i = 0; i < numElements; i++) {
listOfNumbers.emplace_back(d(mersenneTwister));
}
return listOfNumbers;
}
static void SortedNumbers(benchmark::State& state) {
auto numElements = 2000;
std::vector<std::uint8_t> listOfNumbers = getRandomVector(numElements);
// Code inside this loop is measured repeatedly
std::sort(listOfNumbers.begin(), listOfNumbers.end());
for (auto _ : state) {
std::uint64_t lessThan128 = 0;
for (auto number : listOfNumbers) {
if (number < 128u) {
lessThan128+= number;
}
}
benchmark::DoNotOptimize(lessThan128);
}
}
// Register the function as a benchmark
BENCHMARK(SortedNumbers);
static void UnsortedNumbers(benchmark::State& state) {
auto listOfNumbers = getRandomVector(2000);
for (auto _ : state) {
std::uint64_t lessThan128 = 0;
for (auto number : listOfNumbers) {
if (number < 128u) {
lessThan128 += number;
}
}
benchmark::DoNotOptimize(lessThan128);
}
}
BENCHMARK(UnsortedNumbers);
BENCHMARK_MAIN();