|
8 | 8 | #include <random> |
9 | 9 | #include <vector> |
10 | 10 |
|
11 | | -using namespace std; |
| 11 | +#include "utility.hpp" |
12 | 12 |
|
13 | | -vector<bool> createRandomVector(const size_t size) { |
14 | | - static mt19937 gen; |
15 | | - vector<bool> result(size); |
16 | | - generate_n(result.begin(), size, [] { return bernoulli_distribution{0.5}(gen); }); |
17 | | - return result; |
18 | | -} |
| 13 | +using namespace std; |
19 | 14 |
|
20 | 15 | void copy_block_aligned(benchmark::State& state) { |
21 | | - const auto size = static_cast<size_t>(state.range(0)); |
22 | | - const vector<bool> source = createRandomVector(size); |
| 16 | + const auto size = static_cast<size_t>(state.range(0)); |
| 17 | + vector<bool> source = random_bool_vector(size); |
23 | 18 | vector<bool> dest(size, false); |
24 | 19 |
|
25 | 20 | for (auto _ : state) { |
| 21 | + benchmark::DoNotOptimize(source); |
26 | 22 | copy(source.cbegin(), source.cend(), dest.begin()); |
| 23 | + benchmark::DoNotOptimize(dest); |
27 | 24 | } |
28 | 25 | } |
29 | 26 |
|
30 | 27 | void copy_source_misaligned(benchmark::State& state) { |
31 | | - const auto size = static_cast<size_t>(state.range(0)); |
32 | | - const vector<bool> source = createRandomVector(size); |
| 28 | + const auto size = static_cast<size_t>(state.range(0)); |
| 29 | + vector<bool> source = random_bool_vector(size); |
33 | 30 | vector<bool> dest(size, false); |
34 | 31 |
|
35 | 32 | for (auto _ : state) { |
| 33 | + benchmark::DoNotOptimize(source); |
36 | 34 | copy(source.cbegin() + 1, source.cend(), dest.begin()); |
| 35 | + benchmark::DoNotOptimize(dest); |
37 | 36 | } |
38 | 37 | } |
39 | 38 |
|
40 | 39 | void copy_dest_misaligned(benchmark::State& state) { |
41 | | - const auto size = static_cast<size_t>(state.range(0)); |
42 | | - const vector<bool> source = createRandomVector(size); |
| 40 | + const auto size = static_cast<size_t>(state.range(0)); |
| 41 | + vector<bool> source = random_bool_vector(size); |
43 | 42 | vector<bool> dest(size, false); |
44 | 43 |
|
45 | 44 | for (auto _ : state) { |
| 45 | + benchmark::DoNotOptimize(source); |
46 | 46 | copy(source.cbegin(), source.cend() - 1, dest.begin() + 1); |
| 47 | + benchmark::DoNotOptimize(dest); |
47 | 48 | } |
48 | 49 | } |
49 | 50 |
|
50 | 51 | // Special benchmark for matching char alignment |
51 | 52 | void copy_matching_alignment(benchmark::State& state) { |
52 | | - const auto size = static_cast<size_t>(state.range(0)); |
53 | | - const vector<bool> source = createRandomVector(size); |
| 53 | + const auto size = static_cast<size_t>(state.range(0)); |
| 54 | + vector<bool> source = random_bool_vector(size); |
54 | 55 | vector<bool> dest(size, false); |
55 | 56 |
|
56 | 57 | for (auto _ : state) { |
| 58 | + benchmark::DoNotOptimize(source); |
57 | 59 | copy(source.cbegin() + 5, source.cend(), dest.begin() + 5); |
| 60 | + benchmark::DoNotOptimize(dest); |
58 | 61 | } |
59 | 62 | } |
60 | 63 |
|
61 | 64 | // Special benchmarks for single block corner case |
62 | 65 | void copy_both_single_blocks(benchmark::State& state) { |
63 | | - const vector<bool> source = createRandomVector(50); |
| 66 | + vector<bool> source = random_bool_vector(50); |
64 | 67 | vector<bool> dest(50, false); |
65 | 68 |
|
66 | 69 | const size_t length = 20; |
67 | 70 | for (auto _ : state) { |
| 71 | + benchmark::DoNotOptimize(source); |
68 | 72 | copy(source.cbegin() + 5, source.cbegin() + 5 + length, dest.begin() + 5); |
| 73 | + benchmark::DoNotOptimize(dest); |
69 | 74 | } |
70 | 75 | } |
71 | 76 |
|
72 | 77 | void copy_source_single_block(benchmark::State& state) { |
73 | | - const vector<bool> source = createRandomVector(50); |
| 78 | + vector<bool> source = random_bool_vector(50); |
74 | 79 | vector<bool> dest(50, false); |
75 | 80 |
|
76 | 81 | const size_t length = 20; |
77 | 82 | for (auto _ : state) { |
| 83 | + benchmark::DoNotOptimize(source); |
78 | 84 | copy(source.cbegin() + 5, source.cbegin() + 5 + length, dest.begin() + 25); |
| 85 | + benchmark::DoNotOptimize(dest); |
79 | 86 | } |
80 | 87 | } |
81 | 88 |
|
82 | 89 | void copy_dest_single_block(benchmark::State& state) { |
83 | | - const vector<bool> source = createRandomVector(50); |
| 90 | + vector<bool> source = random_bool_vector(50); |
84 | 91 | vector<bool> dest(50, false); |
85 | 92 |
|
86 | 93 | const size_t length = 20; |
87 | 94 | for (auto _ : state) { |
| 95 | + benchmark::DoNotOptimize(source); |
88 | 96 | copy(source.cbegin() + 25, source.cbegin() + 25 + length, dest.begin() + 5); |
| 97 | + benchmark::DoNotOptimize(dest); |
89 | 98 | } |
90 | 99 | } |
91 | 100 |
|
|
0 commit comments