Skip to content

Commit 52121af

Browse files
committed
Restructure benchmark tests
1 parent c131b5c commit 52121af

File tree

3 files changed

+23
-50
lines changed

3 files changed

+23
-50
lines changed

libcxx/test/benchmarks/ContainerBenchmarks.h

Lines changed: 8 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
#include <iterator>
1515
#include <utility>
1616

17-
#include "Utilities.h"
1817
#include "benchmark/benchmark.h"
18+
#include "Utilities.h"
19+
#include "test_iterators.h"
1920

2021
namespace ContainerBenchmarks {
2122

@@ -50,55 +51,16 @@ void BM_Assignment(benchmark::State& st, Container) {
5051
}
5152
}
5253

53-
// Wrap any Iterator into an input iterator
54-
template <typename Iterator>
55-
class InputIterator {
56-
using iter_traits = std::iterator_traits<Iterator>;
57-
58-
public:
59-
using iterator_category = std::input_iterator_tag;
60-
using value_type = typename iter_traits::value_type;
61-
using difference_type = typename iter_traits::difference_type;
62-
using pointer = typename iter_traits::pointer;
63-
using reference = typename iter_traits::reference;
64-
65-
InputIterator(Iterator it) : current_(it) {}
66-
67-
reference operator*() { return *current_; }
68-
InputIterator& operator++() {
69-
++current_;
70-
return *this;
71-
}
72-
InputIterator operator++(int) {
73-
InputIterator tmp = *this;
74-
++(*this);
75-
return tmp;
76-
}
77-
78-
friend bool operator==(const InputIterator& lhs, const InputIterator& rhs) { return lhs.current_ == rhs.current_; }
79-
friend bool operator!=(const InputIterator& lhs, const InputIterator& rhs) { return !(lhs == rhs); }
80-
81-
private:
82-
Iterator current_;
83-
};
84-
85-
template <typename Iterator>
86-
InputIterator<Iterator> make_input_iterator(Iterator it) {
87-
return InputIterator<Iterator>(it);
88-
}
89-
9054
template <class Container,
9155
class GenInputs,
9256
typename std::enable_if<std::is_trivial<typename Container::value_type>::value>::type* = nullptr>
9357
void BM_AssignInputIterIter(benchmark::State& st, Container c, GenInputs gen) {
9458
auto in = gen(st.range(1));
59+
c.resize(st.range(0));
9560
benchmark::DoNotOptimize(&in);
61+
benchmark::DoNotOptimize(&c);
9662
for (auto _ : st) {
97-
st.PauseTiming();
98-
c.resize(st.range(0));
99-
benchmark::DoNotOptimize(&c);
100-
st.ResumeTiming();
101-
c.assign(make_input_iterator(in.begin()), make_input_iterator(in.end()));
63+
c.assign(cpp17_input_iterator(in.begin()), cpp17_input_iterator(in.end()));
10264
benchmark::ClobberMemory();
10365
}
10466
}
@@ -108,14 +70,12 @@ template <class Container,
10870
typename std::enable_if<!std::is_trivial<typename Container::value_type>::value>::type* = nullptr>
10971
void BM_AssignInputIterIter(benchmark::State& st, Container c, GenInputs gen) {
11072
auto v = gen(1, 100);
73+
c.resize(st.range(0), v[0]);
11174
auto in = gen(st.range(1), 32);
11275
benchmark::DoNotOptimize(&in);
76+
benchmark::DoNotOptimize(&c);
11377
for (auto _ : st) {
114-
st.PauseTiming();
115-
c.resize(st.range(0), v[0]);
116-
benchmark::DoNotOptimize(&c);
117-
st.ResumeTiming();
118-
c.assign(make_input_iterator(in.begin()), make_input_iterator(in.end()));
78+
c.assign(cpp17_input_iterator(in.begin()), cpp17_input_iterator(in.end()));
11979
benchmark::ClobberMemory();
12080
}
12181
}

libcxx/test/benchmarks/GenerateInput.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,23 @@ inline std::vector<std::string> getRandomStringInputs(std::size_t N) {
121121
return inputs;
122122
}
123123

124-
inline std::vector<std::string> getRandomStringInputsWithLength(std::size_t N, std::size_t len) {
124+
inline std::vector<std::string> getRandomStringInputsWithLength(std::size_t N, std::size_t len) { // N-by-len
125125
std::vector<std::string> inputs;
126126
inputs.reserve(N);
127-
for (size_t i = 0; i < N; ++i)
127+
for (std::size_t i = 0; i < N; ++i)
128128
inputs.push_back(getRandomString(len));
129129
return inputs;
130130
}
131131

132+
template <class IntT>
133+
inline std::vector<std::vector<IntT>> getRandomIntegerInputsWithLength(std::size_t N, std::size_t len) { // N-by-len
134+
std::vector<std::vector<IntT>> inputs;
135+
inputs.reserve(N);
136+
for (std::size_t i = 0; i < N; ++i)
137+
inputs.push_back(getRandomIntegerInputs<IntT>(len));
138+
return inputs;
139+
}
140+
132141
inline std::vector<std::string> getPrefixedRandomStringInputs(std::size_t N) {
133142
std::vector<std::string> inputs;
134143
inputs.reserve(N);

libcxx/test/benchmarks/vector_operations.bench.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,8 @@ BENCHMARK_CAPTURE(BM_AssignInputIterIter, vector_int, std::vector<int>{}, getRan
8585
BENCHMARK_CAPTURE(BM_AssignInputIterIter, vector_string, std::vector<std::string>{}, getRandomStringInputsWithLength)
8686
->Args({TestNumInputs, TestNumInputs});
8787

88+
BENCHMARK_CAPTURE(
89+
BM_AssignInputIterIter, vector_vector_int, std::vector<std::vector<int>>{}, getRandomIntegerInputsWithLength<int>)
90+
->Args({TestNumInputs, TestNumInputs});
91+
8892
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)