[libcxx-commits] [libcxx] [libc++] Merge the two swap_ranges benchmarks into one (PR #214712)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Aug 10 10:01:47 PDT 2026
https://github.com/ldionne updated https://github.com/llvm/llvm-project/pull/214712
>From d83437cccb9a25121e672a53b74191dc4412b20b Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Thu, 6 Aug 2026 14:40:06 -0400
Subject: [PATCH 1/2] [libc++] Merge the two swap_ranges benchmarks into one
We had two benchmark files for swap_ranges, one for normal containers
and one for vector<bool>. Merge both like we've done elsehwere.
---
.../modifying/swap_ranges.bench.cpp | 35 ++++++++-
.../algorithms/swap_ranges.bench.cpp | 73 -------------------
2 files changed, 34 insertions(+), 74 deletions(-)
delete mode 100644 libcxx/test/benchmarks/algorithms/swap_ranges.bench.cpp
diff --git a/libcxx/test/benchmarks/algorithms/modifying/swap_ranges.bench.cpp b/libcxx/test/benchmarks/algorithms/modifying/swap_ranges.bench.cpp
index 73706bb1be644..ce9e816baf6d3 100644
--- a/libcxx/test/benchmarks/algorithms/modifying/swap_ranges.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/modifying/swap_ranges.bench.cpp
@@ -23,8 +23,11 @@ int main(int argc, char** argv) {
auto std_swap_ranges = [](auto first1, auto last1, auto first2, auto) {
return std::swap_ranges(first1, last1, first2);
};
+ auto ranges_swap_ranges = [](auto first1, auto last1, auto first2, auto last2) {
+ return std::ranges::swap_ranges(first1, last1, first2, last2);
+ };
- // {std,ranges}::swap_ranges(normal container)
+ // std::swap_ranges(normal container)
{
auto bm = []<class Container>(std::string name, auto swap_ranges) {
benchmark::RegisterBenchmark(
@@ -55,6 +58,36 @@ int main(int argc, char** argv) {
bm.operator()<std::list<int>>("std::swap_ranges(list<int>)", std_swap_ranges);
}
+ // {std,ranges}::swap_ranges(vector<bool>)
+ {
+ auto bm = []<bool Aligned>(std::string name, auto swap_ranges) {
+ benchmark::RegisterBenchmark(
+ name,
+ [swap_ranges](auto& st) {
+ std::size_t const size = st.range(0);
+ std::vector<bool> c1(size, true);
+ std::vector<bool> c2(Aligned ? size : size + 8, false);
+ auto first1 = c1.begin();
+ auto last1 = c1.end();
+ auto first2 = Aligned ? c2.begin() : c2.begin() + 4;
+ auto last2 = Aligned ? c2.end() : c2.end() - 4;
+
+ for ([[maybe_unused]] auto _ : st) {
+ benchmark::DoNotOptimize(c1);
+ benchmark::DoNotOptimize(c2);
+ auto result = swap_ranges(first1, last1, first2, last2);
+ benchmark::DoNotOptimize(result);
+ }
+ })
+ ->Arg(50) // non power-of-two
+ ->Range(64, 1 << 20);
+ };
+ bm.operator()<true>("std::swap_ranges(vector<bool>) (aligned)", std_swap_ranges);
+ bm.operator()<false>("std::swap_ranges(vector<bool>) (unaligned)", std_swap_ranges);
+ bm.operator()<true>("rng::swap_ranges(vector<bool>) (aligned)", ranges_swap_ranges);
+ bm.operator()<false>("rng::swap_ranges(vector<bool>) (unaligned)", ranges_swap_ranges);
+ }
+
benchmark::Initialize(&argc, argv);
benchmark::RunSpecifiedBenchmarks();
benchmark::Shutdown();
diff --git a/libcxx/test/benchmarks/algorithms/swap_ranges.bench.cpp b/libcxx/test/benchmarks/algorithms/swap_ranges.bench.cpp
deleted file mode 100644
index 26db45c5f5c46..0000000000000
--- a/libcxx/test/benchmarks/algorithms/swap_ranges.bench.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// 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 <benchmark/benchmark.h>
-#include <vector>
-
-static void bm_ranges_swap_ranges_vb_aligned(benchmark::State& state) {
- auto n = state.range();
- std::vector<bool> vec1(n, true);
- std::vector<bool> vec2(n, false);
- for (auto _ : state) {
- benchmark::DoNotOptimize(std::ranges::swap_ranges(vec1, vec2));
- benchmark::DoNotOptimize(&vec1);
- benchmark::DoNotOptimize(&vec2);
- }
-}
-
-static void bm_ranges_swap_ranges_vb_unaligned(benchmark::State& state) {
- auto n = state.range();
- std::vector<bool> vec1(n, true);
- std::vector<bool> vec2(n + 8, true);
- auto beg1 = std::ranges::begin(vec1);
- auto end1 = std::ranges::end(vec1);
- auto beg2 = std::ranges::begin(vec2) + 4;
- auto end2 = std::ranges::end(vec2) - 4;
- for (auto _ : state) {
- benchmark::DoNotOptimize(std::ranges::swap_ranges(beg1, end1, beg2, end2));
- benchmark::DoNotOptimize(&vec1);
- benchmark::DoNotOptimize(&vec2);
- }
-}
-
-BENCHMARK(bm_ranges_swap_ranges_vb_aligned)
- ->Name("rng::swap_ranges(std::vector<bool>, std::vector<bool>) (aligned)")
- ->RangeMultiplier(2)
- ->Range(8, 1 << 20);
-BENCHMARK(bm_ranges_swap_ranges_vb_unaligned)
- ->Name("rng::swap_ranges(std::vector<bool>, std::vector<bool>) (unaligned)")
- ->Range(8, 1 << 20);
-
-static void bm_swap_ranges_vb(benchmark::State& state, bool aligned) {
- auto n = state.range();
- std::vector<bool> vec1(n, true);
- std::vector<bool> vec2(aligned ? n : n + 8, true);
- auto beg1 = vec1.begin();
- auto end1 = vec1.end();
- auto beg2 = aligned ? vec2.begin() : vec2.begin() + 4;
- for (auto _ : state) {
- benchmark::DoNotOptimize(std::swap_ranges(beg1, end1, beg2));
- benchmark::DoNotOptimize(&vec1);
- benchmark::DoNotOptimize(&vec2);
- }
-}
-
-static void bm_swap_ranges_vb_aligned(benchmark::State& state) { bm_swap_ranges_vb(state, true); }
-static void bm_swap_ranges_vb_unaligned(benchmark::State& state) { bm_swap_ranges_vb(state, false); }
-
-BENCHMARK(bm_swap_ranges_vb_aligned)
- ->Name("std::swap_ranges(std::vector<bool>, std::vector<bool>) (aligned)")
- ->Range(8, 1 << 20);
-BENCHMARK(bm_swap_ranges_vb_unaligned)
- ->Name("std::swap_ranges(std::vector<bool>, std::vector<bool>) (unaligned)")
- ->Range(8, 1 << 20);
-
-BENCHMARK_MAIN();
>From cb38aa2e8117bb8133fae1da73d0bf9a4d317935 Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Mon, 10 Aug 2026 12:50:21 -0400
Subject: [PATCH 2/2] Remove ranges::swap_ranges
---
.../algorithms/modifying/swap_ranges.bench.cpp | 18 +++++-------------
1 file changed, 5 insertions(+), 13 deletions(-)
diff --git a/libcxx/test/benchmarks/algorithms/modifying/swap_ranges.bench.cpp b/libcxx/test/benchmarks/algorithms/modifying/swap_ranges.bench.cpp
index ce9e816baf6d3..922539aea390e 100644
--- a/libcxx/test/benchmarks/algorithms/modifying/swap_ranges.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/modifying/swap_ranges.bench.cpp
@@ -20,12 +20,7 @@
#include "../../GenerateInput.h"
int main(int argc, char** argv) {
- auto std_swap_ranges = [](auto first1, auto last1, auto first2, auto) {
- return std::swap_ranges(first1, last1, first2);
- };
- auto ranges_swap_ranges = [](auto first1, auto last1, auto first2, auto last2) {
- return std::ranges::swap_ranges(first1, last1, first2, last2);
- };
+ auto std_swap_ranges = [](auto first1, auto last1, auto first2) { return std::swap_ranges(first1, last1, first2); };
// std::swap_ranges(normal container)
{
@@ -42,7 +37,7 @@ int main(int argc, char** argv) {
for ([[maybe_unused]] auto _ : st) {
benchmark::DoNotOptimize(c1);
benchmark::DoNotOptimize(c2);
- auto result = swap_ranges(c1.begin(), c1.end(), c2.begin(), c2.end());
+ auto result = swap_ranges(c1.begin(), c1.end(), c2.begin());
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(c1);
benchmark::DoNotOptimize(c2);
@@ -58,7 +53,7 @@ int main(int argc, char** argv) {
bm.operator()<std::list<int>>("std::swap_ranges(list<int>)", std_swap_ranges);
}
- // {std,ranges}::swap_ranges(vector<bool>)
+ // std::swap_ranges(vector<bool>)
{
auto bm = []<bool Aligned>(std::string name, auto swap_ranges) {
benchmark::RegisterBenchmark(
@@ -66,16 +61,15 @@ int main(int argc, char** argv) {
[swap_ranges](auto& st) {
std::size_t const size = st.range(0);
std::vector<bool> c1(size, true);
- std::vector<bool> c2(Aligned ? size : size + 8, false);
+ std::vector<bool> c2(Aligned ? size : size + 4, false);
auto first1 = c1.begin();
auto last1 = c1.end();
auto first2 = Aligned ? c2.begin() : c2.begin() + 4;
- auto last2 = Aligned ? c2.end() : c2.end() - 4;
for ([[maybe_unused]] auto _ : st) {
benchmark::DoNotOptimize(c1);
benchmark::DoNotOptimize(c2);
- auto result = swap_ranges(first1, last1, first2, last2);
+ auto result = swap_ranges(first1, last1, first2);
benchmark::DoNotOptimize(result);
}
})
@@ -84,8 +78,6 @@ int main(int argc, char** argv) {
};
bm.operator()<true>("std::swap_ranges(vector<bool>) (aligned)", std_swap_ranges);
bm.operator()<false>("std::swap_ranges(vector<bool>) (unaligned)", std_swap_ranges);
- bm.operator()<true>("rng::swap_ranges(vector<bool>) (aligned)", ranges_swap_ranges);
- bm.operator()<false>("rng::swap_ranges(vector<bool>) (unaligned)", ranges_swap_ranges);
}
benchmark::Initialize(&argc, argv);
More information about the libcxx-commits
mailing list