[libcxx-commits] [libcxx] [libc++] Fix query benchmarks for associative containers (PR #216065)
via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Aug 13 07:27:03 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libcxx
Author: Louis Dionne (ldionne)
<details>
<summary>Changes</summary>
We were calling get_key and the random number generator in the hot loop. Instead, create a pool of keys to draw from in the initial setup phase, and then query these keys in a round-robin fashion.
---
Full diff: https://github.com/llvm/llvm-project/pull/216065.diff
1 Files Affected:
- (modified) libcxx/test/benchmarks/containers/associative/associative_container_benchmarks.h (+21-5)
``````````diff
diff --git a/libcxx/test/benchmarks/containers/associative/associative_container_benchmarks.h b/libcxx/test/benchmarks/containers/associative/associative_container_benchmarks.h
index 34cd1ca90b647..d83c8db9c3ad5 100644
--- a/libcxx/test/benchmarks/containers/associative/associative_container_benchmarks.h
+++ b/libcxx/test/benchmarks/containers/associative/associative_container_benchmarks.h
@@ -706,12 +706,28 @@ void associative_container_benchmarks(std::string container) {
/////////////////////////
auto query_bench = [=](auto func) {
return [=](auto& st) TEST_ALIGN_BENCHMARK {
- const std::size_t size = st.range(0);
- std::vector<Value> in = make_value_types(generate_unique_keys(size));
- Container c(in.begin(), in.end());
-
+ const std::size_t size = st.range(0);
+ std::vector<Key> keys = generate_unique_keys(size);
+ std::vector<Value> values = make_value_types(keys);
+ Container c(values.begin(), values.end());
+
+ // Create a pool of key indices to draw in the benchmark below. Make the
+ // pool large enough to defeat a branch predictor even when benchmarking
+ // small sizes.
+ const std::size_t N_DRAWS = std::max<std::size_t>(4096, keys.size());
+ std::vector<std::size_t> draws;
+ draws.reserve(N_DRAWS);
+ for (std::size_t i = 0; i != N_DRAWS; ++i) {
+ draws.push_back(getRandomEngine()() % keys.size());
+ }
+
+ std::size_t i = 0;
for (auto _ : st) {
- auto result = func(c, get_key(in[getRandomEngine()() % in.size()]));
+ Key const& key = keys[draws[i]];
+ auto result = func(c, key);
+ ++i;
+ if (i == N_DRAWS)
+ i = 0;
benchmark::DoNotOptimize(c);
benchmark::DoNotOptimize(result);
benchmark::ClobberMemory();
``````````
</details>
https://github.com/llvm/llvm-project/pull/216065
More information about the libcxx-commits
mailing list