Skip to content

Commit 19f0d7f

Browse files
committed
Add benchmark tests
1 parent 1049fcc commit 19f0d7f

File tree

5 files changed

+264
-202
lines changed

5 files changed

+264
-202
lines changed

libcxx/include/__vector/vector.h

Lines changed: 2 additions & 2 deletions
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

Lines changed: 8 additions & 1 deletion
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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,66 @@ void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
135135
}
136136
}
137137

138+
template <class Container, class GenInputs>
139+
void BM_Insert_InputIterIter_NoRealloc(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+
c.reserve(size + in.size()); // force no reallocation
146+
for (auto _ : st) {
147+
benchmark::DoNotOptimize(&(*c.insert(c.begin(), beg, end)));
148+
st.PauseTiming();
149+
c.erase(c.begin() + size, c.end()); // avoid the container to grow indefinitely
150+
st.ResumeTiming();
151+
DoNotOptimizeData(c);
152+
benchmark::ClobberMemory();
153+
}
154+
}
155+
156+
template <class Container, class GenInputs>
157+
void BM_Insert_InputIterIter_Realloc_HalfFilled(benchmark::State& st, Container, GenInputs gen) {
158+
const auto size = st.range(0);
159+
Container a = gen(size);
160+
Container in = gen(size + 10);
161+
DoNotOptimizeData(a);
162+
DoNotOptimizeData(in);
163+
const auto beg = cpp17_input_iterator(in.begin());
164+
const auto end = cpp17_input_iterator(in.end());
165+
for (auto _ : st) {
166+
st.PauseTiming();
167+
Container c;
168+
c.reserve(size * 2); // Reallocation with half-filled container
169+
c = a;
170+
st.ResumeTiming();
171+
benchmark::DoNotOptimize(&(*c.insert(c.begin(), beg, end)));
172+
DoNotOptimizeData(c);
173+
benchmark::ClobberMemory();
174+
}
175+
}
176+
177+
template <class Container, class GenInputs>
178+
void BM_Insert_InputIterIter_Realloc_NearFull(benchmark::State& st, Container, GenInputs gen) {
179+
const auto size = st.range(0);
180+
Container a = gen(size);
181+
Container in = gen(10);
182+
DoNotOptimizeData(a);
183+
DoNotOptimizeData(in);
184+
const auto beg = cpp17_input_iterator(in.begin());
185+
const auto end = cpp17_input_iterator(in.end());
186+
for (auto _ : st) {
187+
st.PauseTiming();
188+
Container c;
189+
c.reserve(size + 5); // Reallocation almost-full container
190+
c = a;
191+
st.ResumeTiming();
192+
benchmark::DoNotOptimize(&(*c.insert(c.begin(), beg, end)));
193+
DoNotOptimizeData(c);
194+
benchmark::ClobberMemory();
195+
}
196+
}
197+
138198
template <class Container, class GenInputs>
139199
void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) {
140200
auto in = gen(st.range(0));

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

Lines changed: 14 additions & 0 deletions
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_NoRealloc, vector_int, std::vector<int>(100, 1), getRandomIntegerInputs<int>)
95+
->Arg(514048);
96+
BENCHMARK_CAPTURE(
97+
BM_Insert_InputIterIter_Realloc_HalfFilled, vector_int, std::vector<int>{}, getRandomIntegerInputs<int>)
98+
->Arg(514048);
99+
BENCHMARK_CAPTURE(BM_Insert_InputIterIter_Realloc_NearFull, vector_int, std::vector<int>{}, getRandomIntegerInputs<int>)
100+
->Arg(514048);
101+
BENCHMARK_CAPTURE(
102+
BM_Insert_InputIterIter_Realloc_HalfFilled, vector_string, std::vector<std::string>{}, getSSORandomStringInputs)
103+
->Arg(514048);
104+
BENCHMARK_CAPTURE(
105+
BM_Insert_InputIterIter_Realloc_NearFull, vector_string, std::vector<std::string>{}, getSSORandomStringInputs)
106+
->Arg(514048);
107+
94108
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)