Skip to content

Commit 39373a0

Browse files
committed
Add benchmark tests
1 parent 9b27794 commit 39373a0

File tree

5 files changed

+277
-202
lines changed

5 files changed

+277
-202
lines changed

libcxx/include/__vector/vector.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -1269,8 +1269,8 @@ vector<_Tp, _Allocator>::__insert_with_sentinel(const_iterator __position, _Inpu
12691269
std::__uninitialized_allocator_relocate(
12701270
__alloc_, std::__to_address(__v.__begin_), std::__to_address(__v.__end_), std::__to_address(__merged.__end_));
12711271
__merged.__end_ += __v.size();
1272-
__v.__end_ = __v.__begin_;
1273-
__p = __swap_out_circular_buffer(__merged, __p);
1272+
__v.__end_ = __v.__begin_;
1273+
__p = __swap_out_circular_buffer(__merged, __p);
12741274
}
12751275
return __make_iter(__p);
12761276
}

libcxx/test/benchmarks/GenerateInput.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,14 @@ std::vector<std::vector<IntT>> getRandomIntegerInputsWithLength(std::size_t N, s
134134
return inputs;
135135
}
136136

137-
inline std::vector<std::string> getPrefixedRandomStringInputs(std::size_t N) {
137+
inline std::vector<std::string> getSSORandomStringInputs(size_t N) {
138+
std::vector<std::string> inputs;
139+
for (size_t i = 0; i < N; ++i)
140+
inputs.push_back(getRandomString(10)); // SSO
141+
return inputs;
142+
}
143+
144+
inline std::vector<std::string> getPrefixedRandomStringInputs(size_t N) {
138145
std::vector<std::string> inputs;
139146
inputs.reserve(N);
140147
constexpr int kSuffixLength = 32;

libcxx/test/benchmarks/containers/ContainerBenchmarks.h

+73
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,79 @@ void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
135135
}
136136
}
137137

138+
template <class Container, class GenInputs>
139+
void BM_insert_inputiteriter(benchmark::State& st, Container c, GenInputs gen) {
140+
auto in = gen(st.range(0));
141+
DoNotOptimizeData(in);
142+
const auto size = c.size();
143+
const auto beg = cpp17_input_iterator(in.begin());
144+
const auto end = cpp17_input_iterator(in.end());
145+
for (auto _ : st) {
146+
benchmark::DoNotOptimize(&(*c.insert(c.begin(), beg, end)));
147+
st.PauseTiming();
148+
c.erase(c.begin() + size, c.end()); // avoid the container to grow indefinitely
149+
st.ResumeTiming();
150+
DoNotOptimizeData(c);
151+
benchmark::ClobberMemory();
152+
}
153+
}
154+
155+
template <class Container, class GenInputs>
156+
void BM_insert_inputiteriter_empty(benchmark::State& st, Container _, GenInputs gen) {
157+
auto in = gen(st.range(0));
158+
DoNotOptimizeData(in);
159+
const auto beg = cpp17_input_iterator(in.begin());
160+
const auto end = cpp17_input_iterator(in.end());
161+
for (auto _ : st) {
162+
Container c; // Test with empty container
163+
benchmark::DoNotOptimize(&(*c.insert(c.begin(), beg, end)));
164+
DoNotOptimizeData(c);
165+
benchmark::ClobberMemory();
166+
}
167+
}
168+
169+
template <class Container, class GenInputs>
170+
void BM_insert_inputiteriter_halffull(benchmark::State& st, Container _, GenInputs gen) {
171+
const auto size = st.range(0);
172+
Container a = gen(size);
173+
Container in = gen(size + 10);
174+
DoNotOptimizeData(a);
175+
DoNotOptimizeData(in);
176+
const auto beg = cpp17_input_iterator(in.begin());
177+
const auto end = cpp17_input_iterator(in.end());
178+
for (auto _ : st) {
179+
st.PauseTiming();
180+
Container c;
181+
c.reserve(size * 2); // Test with half-full container
182+
c = a;
183+
st.ResumeTiming();
184+
benchmark::DoNotOptimize(&(*c.insert(c.begin(), beg, end)));
185+
DoNotOptimizeData(c);
186+
benchmark::ClobberMemory();
187+
}
188+
}
189+
190+
template <class Container, class GenInputs>
191+
void BM_insert_inputiteriter_full(benchmark::State& st, Container _, GenInputs gen) {
192+
const auto size = st.range(0);
193+
Container a = gen(size);
194+
Container in = gen(10);
195+
DoNotOptimizeData(a);
196+
DoNotOptimizeData(in);
197+
const auto beg = cpp17_input_iterator(in.begin());
198+
const auto end = cpp17_input_iterator(in.end());
199+
for (auto _ : st) {
200+
st.PauseTiming();
201+
Container c;
202+
c.reserve(size + 5); // Test with almost-full container
203+
c = a;
204+
st.ResumeTiming();
205+
benchmark::DoNotOptimize(&(*c.insert(c.begin(), beg, end)));
206+
DoNotOptimizeData(c);
207+
benchmark::ClobberMemory();
208+
}
209+
}
210+
138211
template <class Container, class GenInputs>
139212
void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) {
140213
auto in = gen(st.range(0));

libcxx/test/benchmarks/containers/vector_operations.bench.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,18 @@ BENCHMARK_CAPTURE(BM_AssignInputIterIter<100>,
9191
getRandomIntegerInputsWithLength<int>)
9292
->Args({TestNumInputs, TestNumInputs});
9393

94+
BENCHMARK_CAPTURE(BM_insert_inputiteriter_empty, vector_int, std::vector<int>{}, getRandomIntegerInputs<int>)
95+
->Arg(TestNumInputs);
96+
BENCHMARK_CAPTURE(BM_insert_inputiteriter_halffull, vector_int, std::vector<int>{}, getRandomIntegerInputs<int>)
97+
->Arg(TestNumInputs);
98+
BENCHMARK_CAPTURE(BM_insert_inputiteriter_full, vector_int, std::vector<int>{}, getRandomIntegerInputs<int>)
99+
->Arg(TestNumInputs);
100+
101+
BENCHMARK_CAPTURE(BM_insert_inputiteriter_empty, vector_string, std::vector<std::string>{}, getSSORandomStringInputs)
102+
->Arg(TestNumInputs);
103+
BENCHMARK_CAPTURE(BM_insert_inputiteriter_halffull, vector_string, std::vector<std::string>{}, getSSORandomStringInputs)
104+
->Arg(TestNumInputs);
105+
BENCHMARK_CAPTURE(BM_insert_inputiteriter_full, vector_string, std::vector<std::string>{}, getSSORandomStringInputs)
106+
->Arg(TestNumInputs);
107+
94108
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)