[libcxx-commits] [libcxx] [libc++] Add benchmarks for std::binary_search and std::equal_range (PR #207268)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Jul 14 05:50:01 PDT 2026
https://github.com/ldionne updated https://github.com/llvm/llvm-project/pull/207268
>From 0b96a876d2f9d81c139d6695f18184f5c0c75fd1 Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Thu, 2 Jul 2026 13:50:05 -0400
Subject: [PATCH 1/4] [libc++] Add benchmarks for std::binary_search and
std::equal_range
The found and not-found paths are measured as separate benchmarks. For
equal_range we additionally cover a unique match, a large equal range,
and an absent key.
As a drive-by, add a predicate variation to the existing lower_bound and
upper_bound benchmarks.
---
.../nonmodifying/lower_upper_bound.bench.cpp | 129 +++++++++--------
.../sorting/binary_search.bench.cpp | 126 ++++++++++++++++
.../algorithms/sorting/equal_range.bench.cpp | 137 ++++++++++++++++++
3 files changed, 332 insertions(+), 60 deletions(-)
create mode 100644 libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
create mode 100644 libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp
diff --git a/libcxx/test/benchmarks/algorithms/nonmodifying/lower_upper_bound.bench.cpp b/libcxx/test/benchmarks/algorithms/nonmodifying/lower_upper_bound.bench.cpp
index 16ef348539776..8005cea67e0cd 100644
--- a/libcxx/test/benchmarks/algorithms/nonmodifying/lower_upper_bound.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/nonmodifying/lower_upper_bound.bench.cpp
@@ -6,13 +6,13 @@
//
//===----------------------------------------------------------------------===//
-// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
+// UNSUPPORTED: c++03, c++11, c++14, c++17
#include <algorithm>
+#include <cstddef>
#include <deque>
#include <forward_list>
#include <list>
-#include <numeric>
#include <random>
#include <vector>
@@ -20,64 +20,73 @@
#include "../../GenerateInput.h"
int main(int argc, char** argv) {
- {
- auto bm = []<class Container>(benchmark::State& state) static {
- std::mt19937_64 rng{123456};
-
- using value_type = typename Container::value_type;
-
- std::vector<value_type> vec;
- for (int64_t i = 0; i != state.range(); ++i)
- vec.emplace_back(Generate<typename Container::value_type>::random());
- std::sort(vec.begin(), vec.end());
-
- Container c(vec.begin(), vec.end());
-
- for (auto _ : state) {
- auto result = std::lower_bound(c.begin(), c.end(), vec[rng() % vec.size()]);
- benchmark::DoNotOptimize(result);
- benchmark::DoNotOptimize(vec);
- }
- };
-
- auto register_benchmark = [&]<class Container>(std::type_identity<Container>, std::string name) {
- benchmark::RegisterBenchmark(name, bm.template operator()<Container>)->Arg(8)->Arg(100)->Arg(8192);
- };
-
- register_benchmark(std::type_identity<std::vector<int>>{}, "std::lower_bound(std::vector<int>)");
- register_benchmark(std::type_identity<std::deque<int>>{}, "std::lower_bound(std::deque<int>)");
- register_benchmark(std::type_identity<std::list<int>>{}, "std::lower_bound(std::list<int>)");
- register_benchmark(std::type_identity<std::forward_list<int>>{}, "std::lower_bound(std::forward_list<int>)");
- }
- {
- auto bm = []<class Container>(benchmark::State& state) static {
- std::mt19937_64 rng{123456};
-
- using value_type = typename Container::value_type;
-
- std::vector<value_type> vec;
- for (int64_t i = 0; i != state.range(); ++i)
- vec.emplace_back(Generate<typename Container::value_type>::random());
- std::sort(vec.begin(), vec.end());
-
- Container c(vec.begin(), vec.end());
-
- for (auto _ : state) {
- auto result = std::upper_bound(c.begin(), c.end(), vec[rng() % vec.size()]);
- benchmark::DoNotOptimize(result);
- benchmark::DoNotOptimize(vec);
- }
- };
-
- auto register_benchmark = [&]<class Container>(std::type_identity<Container>, std::string name) {
- benchmark::RegisterBenchmark(name, bm.template operator()<Container>)->Arg(8)->Arg(100)->Arg(8192);
- };
-
- register_benchmark(std::type_identity<std::vector<int>>{}, "std::upper_bound(std::vector<int>)");
- register_benchmark(std::type_identity<std::deque<int>>{}, "std::upper_bound(std::deque<int>)");
- register_benchmark(std::type_identity<std::list<int>>{}, "std::upper_bound(std::list<int>)");
- register_benchmark(std::type_identity<std::forward_list<int>>{}, "std::upper_bound(std::forward_list<int>)");
- }
+ auto std_lower_bound = [](auto first, auto last, auto const& value) { return std::lower_bound(first, last, value); };
+ auto std_lower_bound_pred = [](auto first, auto last, auto const& value) {
+ return std::lower_bound(first, last, value, [](auto x, auto y) {
+ benchmark::DoNotOptimize(x);
+ benchmark::DoNotOptimize(y);
+ return x < y;
+ });
+ };
+ auto std_upper_bound = [](auto first, auto last, auto const& value) { return std::upper_bound(first, last, value); };
+ auto std_upper_bound_pred = [](auto first, auto last, auto const& value) {
+ return std::upper_bound(first, last, value, [](auto x, auto y) {
+ benchmark::DoNotOptimize(x);
+ benchmark::DoNotOptimize(y);
+ return x < y;
+ });
+ };
+
+ // Benchmark {lower_bound,upper_bound} on a sorted sequence, looking up a random element that
+ // is present in the sequence.
+ auto bm = []<class Container>(std::string name, auto lookup) {
+ benchmark::RegisterBenchmark(
+ name,
+ [lookup](auto& st) {
+ using ValueType = typename Container::value_type;
+ std::size_t const size = st.range(0);
+
+ // Random sorted data
+ std::vector<ValueType> data(size);
+ std::generate_n(data.begin(), size, &Generate<ValueType>::random);
+ std::sort(data.begin(), data.end());
+
+ // Precompute a bunch of random keys.
+ std::vector<ValueType> keys(data);
+ std::shuffle(keys.begin(), keys.end(), getRandomEngine());
+
+ Container c(data.begin(), data.end());
+ std::size_t pos = 0;
+ for ([[maybe_unused]] auto _ : st) {
+ benchmark::DoNotOptimize(c);
+ auto result = lookup(c.begin(), c.end(), keys[pos]);
+ benchmark::DoNotOptimize(result);
+ if (++pos == keys.size())
+ pos = 0;
+ }
+ })
+ ->Arg(8)
+ ->Arg(100)
+ ->Arg(8192);
+ };
+
+ bm.operator()<std::vector<int>>("std::lower_bound(std::vector<int>)", std_lower_bound);
+ bm.operator()<std::deque<int>>("std::lower_bound(std::deque<int>)", std_lower_bound);
+ bm.operator()<std::list<int>>("std::lower_bound(std::list<int>)", std_lower_bound);
+ bm.operator()<std::forward_list<int>>("std::lower_bound(std::forward_list<int>)", std_lower_bound);
+ bm.operator()<std::vector<int>>("std::lower_bound(std::vector<int>, pred)", std_lower_bound_pred);
+ bm.operator()<std::deque<int>>("std::lower_bound(std::deque<int>, pred)", std_lower_bound_pred);
+ bm.operator()<std::list<int>>("std::lower_bound(std::list<int>, pred)", std_lower_bound_pred);
+ bm.operator()<std::forward_list<int>>("std::lower_bound(std::forward_list<int>, pred)", std_lower_bound_pred);
+
+ bm.operator()<std::vector<int>>("std::upper_bound(std::vector<int>)", std_upper_bound);
+ bm.operator()<std::deque<int>>("std::upper_bound(std::deque<int>)", std_upper_bound);
+ bm.operator()<std::list<int>>("std::upper_bound(std::list<int>)", std_upper_bound);
+ bm.operator()<std::forward_list<int>>("std::upper_bound(std::forward_list<int>)", std_upper_bound);
+ bm.operator()<std::vector<int>>("std::upper_bound(std::vector<int>, pred)", std_upper_bound_pred);
+ bm.operator()<std::deque<int>>("std::upper_bound(std::deque<int>, pred)", std_upper_bound_pred);
+ bm.operator()<std::list<int>>("std::upper_bound(std::list<int>, pred)", std_upper_bound_pred);
+ bm.operator()<std::forward_list<int>>("std::upper_bound(std::forward_list<int>, pred)", std_upper_bound_pred);
benchmark::Initialize(&argc, argv);
benchmark::RunSpecifiedBenchmarks();
diff --git a/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp b/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
new file mode 100644
index 0000000000000..1ceeab794dfd8
--- /dev/null
+++ b/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
@@ -0,0 +1,126 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+#include <algorithm>
+#include <cstddef>
+#include <deque>
+#include <forward_list>
+#include <list>
+#include <random>
+#include <vector>
+
+#include "benchmark/benchmark.h"
+#include "../../GenerateInput.h"
+
+int main(int argc, char** argv) {
+ auto std_binary_search = [](auto first, auto last, auto const& value) {
+ return std::binary_search(first, last, value);
+ };
+ auto std_binary_search_pred = [](auto first, auto last, auto const& value) {
+ return std::binary_search(first, last, value, [](auto x, auto y) {
+ benchmark::DoNotOptimize(x);
+ benchmark::DoNotOptimize(y);
+ return x < y;
+ });
+ };
+
+ // Benchmark binary_search looking up a random key that is present in the sequence.
+ {
+ auto bm = []<class Container>(std::string name, auto binary_search) {
+ benchmark::RegisterBenchmark(
+ name,
+ [binary_search](auto& st) {
+ using ValueType = typename Container::value_type;
+ std::size_t const size = st.range(0);
+
+ // Random sorted data
+ std::vector<ValueType> data(size);
+ std::generate_n(data.begin(), size, &Generate<ValueType>::random);
+ std::sort(data.begin(), data.end());
+
+ // Precompute a bunch of random keys.
+ std::vector<ValueType> keys(data);
+ std::shuffle(keys.begin(), keys.end(), getRandomEngine());
+
+ Container c(data.begin(), data.end());
+ std::size_t pos = 0;
+ for ([[maybe_unused]] auto _ : st) {
+ benchmark::DoNotOptimize(c);
+ bool result = binary_search(c.begin(), c.end(), keys[pos]);
+ benchmark::DoNotOptimize(result);
+ if (++pos == keys.size())
+ pos = 0;
+ }
+ })
+ ->Arg(8)
+ ->Arg(100)
+ ->Arg(8192);
+ };
+ // clang-format off
+ bm.operator()<std::vector<int>>("std::binary_search(vector<int>) (present)", std_binary_search);
+ bm.operator()<std::deque<int>>("std::binary_search(deque<int>) (present)", std_binary_search);
+ bm.operator()<std::list<int>>("std::binary_search(list<int>) (present)", std_binary_search);
+ bm.operator()<std::forward_list<int>>("std::binary_search(forward_list<int>) (present)", std_binary_search);
+
+ bm.operator()<std::vector<int>>("std::binary_search(vector<int>, pred) (present)", std_binary_search_pred);
+ bm.operator()<std::deque<int>>("std::binary_search(deque<int>, pred) (present)", std_binary_search_pred);
+ bm.operator()<std::list<int>>("std::binary_search(list<int>, pred) (present)", std_binary_search_pred);
+ bm.operator()<std::forward_list<int>>("std::binary_search(forward_list<int>, pred) (present)", std_binary_search_pred);
+ // clang-format on
+ }
+
+ // Benchmark binary_search looking up a key that is absent from the sequence.
+ {
+ auto bm = []<class Container>(std::string name, auto binary_search) {
+ benchmark::RegisterBenchmark(
+ name,
+ [binary_search](auto& st) {
+ using ValueType = typename Container::value_type;
+ std::size_t const size = st.range(0);
+
+ // Random sorted data
+ std::vector<ValueType> data(size);
+ std::generate_n(data.begin(), size, &Generate<ValueType>::random);
+ std::sort(data.begin(), data.end());
+
+ // Find a key that isn't in the sequence
+ ValueType absent = Generate<ValueType>::random();
+ while (std::find(data.begin(), data.end(), absent) != data.end())
+ absent = Generate<ValueType>::random();
+
+ Container c(data.begin(), data.end());
+ for ([[maybe_unused]] auto _ : st) {
+ benchmark::DoNotOptimize(c);
+ bool result = binary_search(c.begin(), c.end(), absent);
+ benchmark::DoNotOptimize(result);
+ }
+ })
+ ->Arg(8)
+ ->Arg(100)
+ ->Arg(8192);
+ };
+ // clang-format off
+ bm.operator()<std::vector<int>>("std::binary_search(vector<int>) (absent)", std_binary_search);
+ bm.operator()<std::deque<int>>("std::binary_search(deque<int>) (absent)", std_binary_search);
+ bm.operator()<std::list<int>>("std::binary_search(list<int>) (absent)", std_binary_search);
+ bm.operator()<std::forward_list<int>>("std::binary_search(forward_list<int>) (absent)", std_binary_search);
+
+ bm.operator()<std::vector<int>>("std::binary_search(vector<int>, pred) (absent)", std_binary_search_pred);
+ bm.operator()<std::deque<int>>("std::binary_search(deque<int>, pred) (absent)", std_binary_search_pred);
+ bm.operator()<std::list<int>>("std::binary_search(list<int>, pred) (absent)", std_binary_search_pred);
+ bm.operator()<std::forward_list<int>>("std::binary_search(forward_list<int>, pred) (absent)", std_binary_search_pred);
+ // clang-format on
+ }
+
+ benchmark::Initialize(&argc, argv);
+ benchmark::RunSpecifiedBenchmarks();
+ benchmark::Shutdown();
+ return 0;
+}
diff --git a/libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp b/libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp
new file mode 100644
index 0000000000000..c984554b839ad
--- /dev/null
+++ b/libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp
@@ -0,0 +1,137 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+#include <algorithm>
+#include <cstddef>
+#include <deque>
+#include <forward_list>
+#include <list>
+#include <numeric>
+#include <vector>
+
+#include "benchmark/benchmark.h"
+
+int main(int argc, char** argv) {
+ auto std_equal_range = [](auto first, auto last, auto const& value) { return std::equal_range(first, last, value); };
+ auto std_equal_range_pred = [](auto first, auto last, auto const& value) {
+ return std::equal_range(first, last, value, [](auto x, auto y) {
+ benchmark::DoNotOptimize(x);
+ benchmark::DoNotOptimize(y);
+ return x < y;
+ });
+ };
+
+ // The range we find is a single element.
+ {
+ auto bm = []<class Container>(std::string name, auto equal_range) {
+ benchmark::RegisterBenchmark(
+ name,
+ [equal_range](auto& st) {
+ std::size_t const size = st.range(0);
+ std::vector<int> data(size);
+ std::iota(data.begin(), data.end(), 0);
+ int const key = static_cast<int>(size / 2);
+
+ Container c(data.begin(), data.end());
+ for ([[maybe_unused]] auto _ : st) {
+ benchmark::DoNotOptimize(c);
+ auto result = equal_range(c.begin(), c.end(), key);
+ benchmark::DoNotOptimize(result);
+ }
+ })
+ ->Arg(8)
+ ->Arg(100)
+ ->Arg(8192);
+ };
+ bm.operator()<std::vector<int>>("std::equal_range(vector<int>) (unique)", std_equal_range);
+ bm.operator()<std::deque<int>>("std::equal_range(deque<int>) (unique)", std_equal_range);
+ bm.operator()<std::list<int>>("std::equal_range(list<int>) (unique)", std_equal_range);
+ bm.operator()<std::forward_list<int>>("std::equal_range(forward_list<int>) (unique)", std_equal_range);
+ bm.operator()<std::vector<int>>("std::equal_range(vector<int>, pred) (unique)", std_equal_range_pred);
+ bm.operator()<std::deque<int>>("std::equal_range(deque<int>, pred) (unique)", std_equal_range_pred);
+ bm.operator()<std::list<int>>("std::equal_range(list<int>, pred) (unique)", std_equal_range_pred);
+ bm.operator()<std::forward_list<int>>("std::equal_range(forward_list<int>, pred) (unique)", std_equal_range_pred);
+ }
+
+ // The range we find is a large part of the entire range.
+ // Data looks like [0, 1, 2, 2, 2, 2, 2, 7, 8, 9], we match the 2's.
+ {
+ auto bm = []<class Container>(std::string name, auto equal_range) {
+ benchmark::RegisterBenchmark(
+ name,
+ [equal_range](auto& st) {
+ std::size_t const size = st.range(0);
+ std::size_t const subrange_size = size / 2;
+ std::size_t const left_flank = (size - subrange_size) / 2;
+ std::vector<int> data(size);
+ std::iota(data.begin(), data.end(), 0); // [0, 1, 2, 3, ..., 8, 9]
+ int const key = data[left_flank];
+ std::fill_n(data.begin() + left_flank, subrange_size,
+ key); // [0, 1, 2, 3, 3, 3, 3, ..., 8, 9]
+
+ Container c(data.begin(), data.end());
+ for ([[maybe_unused]] auto _ : st) {
+ benchmark::DoNotOptimize(c);
+ auto result = equal_range(c.begin(), c.end(), key);
+ benchmark::DoNotOptimize(result);
+ }
+ })
+ ->Arg(8)
+ ->Arg(100)
+ ->Arg(8192);
+ };
+ bm.operator()<std::vector<int>>("std::equal_range(vector<int>) (large range)", std_equal_range);
+ bm.operator()<std::deque<int>>("std::equal_range(deque<int>) (large range)", std_equal_range);
+ bm.operator()<std::list<int>>("std::equal_range(list<int>) (large range)", std_equal_range);
+ bm.operator()<std::forward_list<int>>("std::equal_range(forward_list<int>) (large range)", std_equal_range);
+ bm.operator()<std::vector<int>>("std::equal_range(vector<int>, pred) (large range)", std_equal_range_pred);
+ bm.operator()<std::deque<int>>("std::equal_range(deque<int>, pred) (large range)", std_equal_range_pred);
+ bm.operator()<std::list<int>>("std::equal_range(list<int>, pred) (large range)", std_equal_range_pred);
+ bm.operator()<std::forward_list<int>>(
+ "std::equal_range(forward_list<int>, pred) (large range)", std_equal_range_pred);
+ }
+
+ // The searched-for value is not present, so the found range is empty.
+ {
+ auto bm = []<class Container>(std::string name, auto equal_range) {
+ benchmark::RegisterBenchmark(
+ name,
+ [equal_range](auto& st) {
+ std::size_t const size = st.range(0);
+ std::vector<int> data(size);
+ std::iota(data.begin(), data.end(), 0);
+ int const key = static_cast<int>(size); // one past the last element
+
+ Container c(data.begin(), data.end());
+ for ([[maybe_unused]] auto _ : st) {
+ benchmark::DoNotOptimize(c);
+ auto result = equal_range(c.begin(), c.end(), key);
+ benchmark::DoNotOptimize(result);
+ }
+ })
+ ->Arg(8)
+ ->Arg(100)
+ ->Arg(8192);
+ };
+ bm.operator()<std::vector<int>>("std::equal_range(vector<int>) (absent)", std_equal_range);
+ bm.operator()<std::deque<int>>("std::equal_range(deque<int>) (absent)", std_equal_range);
+ bm.operator()<std::list<int>>("std::equal_range(list<int>) (absent)", std_equal_range);
+ bm.operator()<std::forward_list<int>>("std::equal_range(forward_list<int>) (absent)", std_equal_range);
+ bm.operator()<std::vector<int>>("std::equal_range(vector<int>, pred) (absent)", std_equal_range_pred);
+ bm.operator()<std::deque<int>>("std::equal_range(deque<int>, pred) (absent)", std_equal_range_pred);
+ bm.operator()<std::list<int>>("std::equal_range(list<int>, pred) (absent)", std_equal_range_pred);
+ bm.operator()<std::forward_list<int>>("std::equal_range(forward_list<int>, pred) (absent)", std_equal_range_pred);
+ }
+
+ benchmark::Initialize(&argc, argv);
+ benchmark::RunSpecifiedBenchmarks();
+ benchmark::Shutdown();
+ return 0;
+}
>From 814c0fe3d71f26cb9edac58738b95853d82e6e5d Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Thu, 2 Jul 2026 16:18:26 -0400
Subject: [PATCH 2/4] Remove unused includes
---
.../test/benchmarks/algorithms/sorting/binary_search.bench.cpp | 1 -
.../benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp | 1 -
2 files changed, 2 deletions(-)
diff --git a/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp b/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
index 1ceeab794dfd8..101ffc418925d 100644
--- a/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
@@ -13,7 +13,6 @@
#include <deque>
#include <forward_list>
#include <list>
-#include <random>
#include <vector>
#include "benchmark/benchmark.h"
diff --git a/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp b/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp
index 8005cea67e0cd..fbba276796d8a 100644
--- a/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp
@@ -13,7 +13,6 @@
#include <deque>
#include <forward_list>
#include <list>
-#include <random>
#include <vector>
#include "benchmark/benchmark.h"
>From 70f71300874780976e18f134d6cd0279db4b847a Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Tue, 14 Jul 2026 08:48:43 -0400
Subject: [PATCH 3/4] Remove DoNotOptimize
---
.../algorithms/sorting/binary_search.bench.cpp | 6 +-----
.../algorithms/sorting/equal_range.bench.cpp | 6 +-----
.../algorithms/sorting/lower_upper_bound.bench.cpp | 12 ++----------
3 files changed, 4 insertions(+), 20 deletions(-)
diff --git a/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp b/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
index 101ffc418925d..1781fb68526e5 100644
--- a/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
@@ -23,11 +23,7 @@ int main(int argc, char** argv) {
return std::binary_search(first, last, value);
};
auto std_binary_search_pred = [](auto first, auto last, auto const& value) {
- return std::binary_search(first, last, value, [](auto x, auto y) {
- benchmark::DoNotOptimize(x);
- benchmark::DoNotOptimize(y);
- return x < y;
- });
+ return std::binary_search(first, last, value, [](auto x, auto y) { return x < y; });
};
// Benchmark binary_search looking up a random key that is present in the sequence.
diff --git a/libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp b/libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp
index c984554b839ad..b29834d669cef 100644
--- a/libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp
@@ -21,11 +21,7 @@
int main(int argc, char** argv) {
auto std_equal_range = [](auto first, auto last, auto const& value) { return std::equal_range(first, last, value); };
auto std_equal_range_pred = [](auto first, auto last, auto const& value) {
- return std::equal_range(first, last, value, [](auto x, auto y) {
- benchmark::DoNotOptimize(x);
- benchmark::DoNotOptimize(y);
- return x < y;
- });
+ return std::equal_range(first, last, value, [](auto x, auto y) { return x < y; });
};
// The range we find is a single element.
diff --git a/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp b/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp
index fbba276796d8a..6877184b8cc0c 100644
--- a/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp
@@ -21,19 +21,11 @@
int main(int argc, char** argv) {
auto std_lower_bound = [](auto first, auto last, auto const& value) { return std::lower_bound(first, last, value); };
auto std_lower_bound_pred = [](auto first, auto last, auto const& value) {
- return std::lower_bound(first, last, value, [](auto x, auto y) {
- benchmark::DoNotOptimize(x);
- benchmark::DoNotOptimize(y);
- return x < y;
- });
+ return std::lower_bound(first, last, value, [](auto x, auto y) { return x < y; });
};
auto std_upper_bound = [](auto first, auto last, auto const& value) { return std::upper_bound(first, last, value); };
auto std_upper_bound_pred = [](auto first, auto last, auto const& value) {
- return std::upper_bound(first, last, value, [](auto x, auto y) {
- benchmark::DoNotOptimize(x);
- benchmark::DoNotOptimize(y);
- return x < y;
- });
+ return std::upper_bound(first, last, value, [](auto x, auto y) { return x < y; });
};
// Benchmark {lower_bound,upper_bound} on a sorted sequence, looking up a random element that
>From 1c244cc7a2c9d26f4d71a50cb8fc716a92f4c4a0 Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Tue, 14 Jul 2026 08:49:49 -0400
Subject: [PATCH 4/4] maybe unused
---
.../benchmarks/algorithms/sorting/binary_search.bench.cpp | 4 ++--
.../benchmarks/algorithms/sorting/equal_range.bench.cpp | 6 +++---
.../algorithms/sorting/lower_upper_bound.bench.cpp | 2 +-
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp b/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
index 1781fb68526e5..9b85911961af4 100644
--- a/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/sorting/binary_search.bench.cpp
@@ -46,7 +46,7 @@ int main(int argc, char** argv) {
Container c(data.begin(), data.end());
std::size_t pos = 0;
- for ([[maybe_unused]] auto _ : st) {
+ for (auto _ : st) {
benchmark::DoNotOptimize(c);
bool result = binary_search(c.begin(), c.end(), keys[pos]);
benchmark::DoNotOptimize(result);
@@ -91,7 +91,7 @@ int main(int argc, char** argv) {
absent = Generate<ValueType>::random();
Container c(data.begin(), data.end());
- for ([[maybe_unused]] auto _ : st) {
+ for (auto _ : st) {
benchmark::DoNotOptimize(c);
bool result = binary_search(c.begin(), c.end(), absent);
benchmark::DoNotOptimize(result);
diff --git a/libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp b/libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp
index b29834d669cef..7c4d943019baa 100644
--- a/libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/sorting/equal_range.bench.cpp
@@ -36,7 +36,7 @@ int main(int argc, char** argv) {
int const key = static_cast<int>(size / 2);
Container c(data.begin(), data.end());
- for ([[maybe_unused]] auto _ : st) {
+ for (auto _ : st) {
benchmark::DoNotOptimize(c);
auto result = equal_range(c.begin(), c.end(), key);
benchmark::DoNotOptimize(result);
@@ -73,7 +73,7 @@ int main(int argc, char** argv) {
key); // [0, 1, 2, 3, 3, 3, 3, ..., 8, 9]
Container c(data.begin(), data.end());
- for ([[maybe_unused]] auto _ : st) {
+ for (auto _ : st) {
benchmark::DoNotOptimize(c);
auto result = equal_range(c.begin(), c.end(), key);
benchmark::DoNotOptimize(result);
@@ -106,7 +106,7 @@ int main(int argc, char** argv) {
int const key = static_cast<int>(size); // one past the last element
Container c(data.begin(), data.end());
- for ([[maybe_unused]] auto _ : st) {
+ for (auto _ : st) {
benchmark::DoNotOptimize(c);
auto result = equal_range(c.begin(), c.end(), key);
benchmark::DoNotOptimize(result);
diff --git a/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp b/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp
index 6877184b8cc0c..36eefac3ef4e5 100644
--- a/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/sorting/lower_upper_bound.bench.cpp
@@ -48,7 +48,7 @@ int main(int argc, char** argv) {
Container c(data.begin(), data.end());
std::size_t pos = 0;
- for ([[maybe_unused]] auto _ : st) {
+ for (auto _ : st) {
benchmark::DoNotOptimize(c);
auto result = lookup(c.begin(), c.end(), keys[pos]);
benchmark::DoNotOptimize(result);
More information about the libcxx-commits
mailing list