[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