Skip to content

Commit 87f94b9

Browse files
committed
Restructure benchmark tests
1 parent 66ed5de commit 87f94b9

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
@@ -12,8 +12,9 @@
1212

1313
#include <cassert>
1414

15-
#include "Utilities.h"
1615
#include "benchmark/benchmark.h"
16+
#include "Utilities.h"
17+
#include "test_iterators.h"
1718

1819
namespace ContainerBenchmarks {
1920

@@ -48,55 +49,16 @@ void BM_Assignment(benchmark::State& st, Container) {
4849
}
4950
}
5051

51-
// Wrap any Iterator into an input iterator
52-
template <typename Iterator>
53-
class InputIterator {
54-
using iter_traits = std::iterator_traits<Iterator>;
55-
56-
public:
57-
using iterator_category = std::input_iterator_tag;
58-
using value_type = typename iter_traits::value_type;
59-
using difference_type = typename iter_traits::difference_type;
60-
using pointer = typename iter_traits::pointer;
61-
using reference = typename iter_traits::reference;
62-
63-
InputIterator(Iterator it) : current_(it) {}
64-
65-
reference operator*() { return *current_; }
66-
InputIterator& operator++() {
67-
++current_;
68-
return *this;
69-
}
70-
InputIterator operator++(int) {
71-
InputIterator tmp = *this;
72-
++(*this);
73-
return tmp;
74-
}
75-
76-
friend bool operator==(const InputIterator& lhs, const InputIterator& rhs) { return lhs.current_ == rhs.current_; }
77-
friend bool operator!=(const InputIterator& lhs, const InputIterator& rhs) { return !(lhs == rhs); }
78-
79-
private:
80-
Iterator current_;
81-
};
82-
83-
template <typename Iterator>
84-
InputIterator<Iterator> make_input_iterator(Iterator it) {
85-
return InputIterator<Iterator>(it);
86-
}
87-
8852
template <class Container,
8953
class GenInputs,
9054
typename std::enable_if<std::is_trivial<typename Container::value_type>::value>::type* = nullptr>
9155
void BM_AssignInputIterIter(benchmark::State& st, Container c, GenInputs gen) {
9256
auto in = gen(st.range(1));
57+
c.resize(st.range(0));
9358
benchmark::DoNotOptimize(&in);
59+
benchmark::DoNotOptimize(&c);
9460
for (auto _ : st) {
95-
st.PauseTiming();
96-
c.resize(st.range(0));
97-
benchmark::DoNotOptimize(&c);
98-
st.ResumeTiming();
99-
c.assign(make_input_iterator(in.begin()), make_input_iterator(in.end()));
61+
c.assign(cpp17_input_iterator(in.begin()), cpp17_input_iterator(in.end()));
10062
benchmark::ClobberMemory();
10163
}
10264
}
@@ -106,14 +68,12 @@ template <class Container,
10668
typename std::enable_if<!std::is_trivial<typename Container::value_type>::value>::type* = nullptr>
10769
void BM_AssignInputIterIter(benchmark::State& st, Container c, GenInputs gen) {
10870
auto v = gen(1, 100);
71+
c.resize(st.range(0), v[0]);
10972
auto in = gen(st.range(1), 32);
11073
benchmark::DoNotOptimize(&in);
74+
benchmark::DoNotOptimize(&c);
11175
for (auto _ : st) {
112-
st.PauseTiming();
113-
c.resize(st.range(0), v[0]);
114-
benchmark::DoNotOptimize(&c);
115-
st.ResumeTiming();
116-
c.assign(make_input_iterator(in.begin()), make_input_iterator(in.end()));
76+
c.assign(cpp17_input_iterator(in.begin()), cpp17_input_iterator(in.end()));
11777
benchmark::ClobberMemory();
11878
}
11979
}

libcxx/test/benchmarks/GenerateInput.h

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

119-
inline std::vector<std::string> getRandomStringInputsWithLength(std::size_t N, std::size_t len) {
119+
inline std::vector<std::string> getRandomStringInputsWithLength(std::size_t N, std::size_t len) { // N-by-len
120120
std::vector<std::string> inputs;
121121
inputs.reserve(N);
122-
for (size_t i = 0; i < N; ++i)
122+
for (std::size_t i = 0; i < N; ++i)
123123
inputs.push_back(getRandomString(len));
124124
return inputs;
125125
}
126126

127+
template <class IntT>
128+
inline std::vector<std::vector<IntT>> getRandomIntegerInputsWithLength(std::size_t N, std::size_t len) { // N-by-len
129+
std::vector<std::vector<IntT>> inputs;
130+
inputs.reserve(N);
131+
for (std::size_t i = 0; i < N; ++i)
132+
inputs.push_back(getRandomIntegerInputs<IntT>(len));
133+
return inputs;
134+
}
135+
127136
inline std::vector<std::string> getPrefixedRandomStringInputs(std::size_t N) {
128137
std::vector<std::string> inputs;
129138
constexpr int kSuffixLength = 32;

libcxx/test/benchmarks/vector_operations.bench.cpp

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

78+
BENCHMARK_CAPTURE(
79+
BM_AssignInputIterIter, vector_vector_int, std::vector<std::vector<int>>{}, getRandomIntegerInputsWithLength<int>)
80+
->Args({TestNumInputs, TestNumInputs});
81+
7882
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)