-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbench_transform_set.cpp
95 lines (78 loc) · 2.78 KB
/
bench_transform_set.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
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
#include <benchmark/benchmark.h>
#include <algorithm>
#include <cstring>
#include <execution>
#include <functional>
#include <iterator>
#include <set>
#include <string>
#include <random>
class Space
{
public:
Space(const std::string& name) : m_name(name){};
std::string nameString() const {
return m_name;
}
private:
std::string m_name;
std::string m_other;
std::string m_other2;
};
auto generate_random_alphanumeric_string(std::size_t len) -> std::string {
static constexpr auto chars = "0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
std::random_device rd; //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
auto dist = std::uniform_int_distribution{{}, std::strlen(chars) - 1};
auto result = std::string(len, '\0');
std::generate_n(begin(result), len, [&]() { return chars[dist(gen)]; });
return result;
}
auto makeVectorOfStrings(std::size_t len) -> std::vector<std::string> {
std::vector<std::string> vectorOfStrings(len);
auto genString = []() {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dist(1, 20);
return generate_random_alphanumeric_string(dist(gen));
};
std::generate(vectorOfStrings.begin(), vectorOfStrings.end(), genString);
return vectorOfStrings;
}
void makeDuplicates(std::vector<std::string>& vec) {
for (size_t i = 0; i < vec.size(); i = i + 10) {
vec[i] = "A";
}
}
auto makeVectorOfSpaces(std::size_t len) -> std::vector<Space> {
auto vectorOfStrings = makeVectorOfStrings(len);
makeDuplicates(vectorOfStrings);
std::vector<Space> result;
result.reserve(len);
std::transform(vectorOfStrings.begin(), vectorOfStrings.end(), std::back_inserter(result), [](const auto& s) { return Space(s); });
return result;
}
static void BM_RawLoop(benchmark::State& state) {
std::vector<Space> vectorOfSpaces = makeVectorOfSpaces(state.range(0));
for (auto _ : state) {
std::set<std::string> result;
for (const auto& s : vectorOfSpaces) {
result.insert(s.nameString());
}
benchmark::DoNotOptimize(result);
}
state.SetComplexityN(state.range(0));
}
static void BM_Transform(benchmark::State& state) {
std::vector<Space> vectorOfSpaces = makeVectorOfSpaces(state.range(0));
for (auto _ : state) {
std::set<std::string> result;
std::transform(vectorOfSpaces.cbegin(), vectorOfSpaces.cend(), std::inserter(result, result.begin()),
[](const auto& s) { return s.nameString(); });
}
state.SetComplexityN(state.range(0));
}
BENCHMARK(BM_RawLoop)->RangeMultiplier(4)->Range(8, 8 << 16)->Complexity();
BENCHMARK(BM_Transform)->RangeMultiplier(4)->Range(8, 8 << 16)->Complexity();