[libcxx-commits] [libcxx] [libc++] Reduce the number of runs on the ranges::min{, max} benchmarks (PR #179912)

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Mon Feb 9 07:07:23 PST 2026


https://github.com/philnik777 updated https://github.com/llvm/llvm-project/pull/179912

>From 94b142a27530a11319f8bf6ae56fd09c49897411 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Thu, 5 Feb 2026 12:20:38 +0100
Subject: [PATCH] [libc++] Reduce the number of runs on the std::min{,max}
 benchmarks

---
 .../test/benchmarks/algorithms/min.bench.cpp  | 99 ++++++-------------
 .../benchmarks/algorithms/minmax.bench.cpp    | 92 ++++++-----------
 2 files changed, 64 insertions(+), 127 deletions(-)

diff --git a/libcxx/test/benchmarks/algorithms/min.bench.cpp b/libcxx/test/benchmarks/algorithms/min.bench.cpp
index 9928afd567737..ae523e9460fe1 100644
--- a/libcxx/test/benchmarks/algorithms/min.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/min.bench.cpp
@@ -10,76 +10,41 @@
 
 #include <algorithm>
 #include <cassert>
+#include <deque>
+#include <vector>
 
 #include <benchmark/benchmark.h>
-#include "test_macros.h"
 
-void run_sizes(auto benchmark) {
-  benchmark->Arg(1)
-      ->Arg(2)
-      ->Arg(3)
-      ->Arg(4)
-      ->Arg(5)
-      ->Arg(6)
-      ->Arg(7)
-      ->Arg(8)
-      ->Arg(9)
-      ->Arg(10)
-      ->Arg(11)
-      ->Arg(12)
-      ->Arg(13)
-      ->Arg(14)
-      ->Arg(15)
-      ->Arg(16)
-      ->Arg(17)
-      ->Arg(18)
-      ->Arg(19)
-      ->Arg(20)
-      ->Arg(21)
-      ->Arg(22)
-      ->Arg(23)
-      ->Arg(24)
-      ->Arg(25)
-      ->Arg(26)
-      ->Arg(27)
-      ->Arg(28)
-      ->Arg(29)
-      ->Arg(30)
-      ->Arg(31)
-      ->Arg(32)
-      ->Arg(64)
-      ->Arg(512)
-      ->Arg(1024)
-      ->Arg(4000)
-      ->Arg(4096)
-      ->Arg(5500)
-      ->Arg(64000)
-      ->Arg(65536)
-      ->Arg(70000);
-}
+int main(int argc, char** argv) {
+  auto bm = []<class Container>(std::type_identity<Container>, std::string name) {
+    benchmark::RegisterBenchmark(
+        name,
+        [](benchmark::State& state) {
+          Container vec(state.range(), 3);
 
-template <class T>
-static void BM_std_min(benchmark::State& state) {
-  std::vector<T> vec(state.range(), 3);
+          for (auto _ : state) {
+            benchmark::DoNotOptimize(vec);
+            benchmark::DoNotOptimize(std::ranges::min(vec));
+          }
+        })
+        ->Arg(1)
+        ->Arg(8)
+        ->Arg(64)
+        ->Arg(70000);
+  };
 
-  for (auto _ : state) {
-    benchmark::DoNotOptimize(vec);
-    benchmark::DoNotOptimize(std::ranges::min(vec));
-  }
-}
-BENCHMARK(BM_std_min<char>)->Apply(run_sizes);
-BENCHMARK(BM_std_min<short>)->Apply(run_sizes);
-BENCHMARK(BM_std_min<int>)->Apply(run_sizes);
-BENCHMARK(BM_std_min<long long>)->Apply(run_sizes);
-#ifndef TEST_HAS_NO_INT128
-BENCHMARK(BM_std_min<__int128>)->Apply(run_sizes);
-#endif
-BENCHMARK(BM_std_min<unsigned char>)->Apply(run_sizes);
-BENCHMARK(BM_std_min<unsigned short>)->Apply(run_sizes);
-BENCHMARK(BM_std_min<unsigned int>)->Apply(run_sizes);
-BENCHMARK(BM_std_min<unsigned long long>)->Apply(run_sizes);
-#ifndef TEST_HAS_NO_INT128
-BENCHMARK(BM_std_min<unsigned __int128>)->Apply(run_sizes);
-#endif
+  bm(std::type_identity<std::vector<char>>(), "ranges::min(std::vector<char>)");
+  bm(std::type_identity<std::vector<long long>>(), "ranges::min(std::vector<long long>)");
+  bm(std::type_identity<std::vector<__int128>>(), "ranges::min(std::vector<__int128>)");
+  bm(std::type_identity<std::vector<unsigned __int128>>(), "ranges::min(std::vector<__int128>)");
 
-BENCHMARK_MAIN();
+  bm(std::type_identity<std::deque<char>>(), "ranges::min(std::deque<char>)");
+  bm(std::type_identity<std::deque<long long>>(), "ranges::min(std::deque<long long>)");
+  bm(std::type_identity<std::deque<__int128>>(), "ranges::min(std::deque<__int128>)");
+  bm(std::type_identity<std::deque<unsigned __int128>>(), "ranges::min(std::deque<__int128>)");
+
+  benchmark::Initialize(&argc, argv);
+  benchmark::RunSpecifiedBenchmarks();
+  benchmark::Shutdown();
+  return 0;
+}
diff --git a/libcxx/test/benchmarks/algorithms/minmax.bench.cpp b/libcxx/test/benchmarks/algorithms/minmax.bench.cpp
index 7d7c74c9c96aa..10f18b060e946 100644
--- a/libcxx/test/benchmarks/algorithms/minmax.bench.cpp
+++ b/libcxx/test/benchmarks/algorithms/minmax.bench.cpp
@@ -10,69 +10,41 @@
 
 #include <algorithm>
 #include <cassert>
+#include <deque>
+#include <vector>
 
 #include <benchmark/benchmark.h>
 
-void run_sizes(auto benchmark) {
-  benchmark->Arg(1)
-      ->Arg(2)
-      ->Arg(3)
-      ->Arg(4)
-      ->Arg(5)
-      ->Arg(6)
-      ->Arg(7)
-      ->Arg(8)
-      ->Arg(9)
-      ->Arg(10)
-      ->Arg(11)
-      ->Arg(12)
-      ->Arg(13)
-      ->Arg(14)
-      ->Arg(15)
-      ->Arg(16)
-      ->Arg(17)
-      ->Arg(18)
-      ->Arg(19)
-      ->Arg(20)
-      ->Arg(21)
-      ->Arg(22)
-      ->Arg(23)
-      ->Arg(24)
-      ->Arg(25)
-      ->Arg(26)
-      ->Arg(27)
-      ->Arg(28)
-      ->Arg(29)
-      ->Arg(30)
-      ->Arg(31)
-      ->Arg(32)
-      ->Arg(64)
-      ->Arg(512)
-      ->Arg(1024)
-      ->Arg(4000)
-      ->Arg(4096)
-      ->Arg(5500)
-      ->Arg(64000)
-      ->Arg(65536)
-      ->Arg(70000);
-}
+int main(int argc, char** argv) {
+  auto bm = []<class Container>(std::type_identity<Container>, std::string name) {
+    benchmark::RegisterBenchmark(
+        name,
+        [](benchmark::State& state) {
+          Container vec(state.range(), 3);
 
-template <class T>
-static void BM_std_minmax(benchmark::State& state) {
-  std::vector<T> vec(state.range(), 3);
+          for (auto _ : state) {
+            benchmark::DoNotOptimize(vec);
+            benchmark::DoNotOptimize(std::ranges::minmax(vec));
+          }
+        })
+        ->Arg(1)
+        ->Arg(8)
+        ->Arg(64)
+        ->Arg(70000);
+  };
 
-  for (auto _ : state) {
-    benchmark::DoNotOptimize(vec);
-    benchmark::DoNotOptimize(std::ranges::minmax(vec));
-  }
-}
-BENCHMARK(BM_std_minmax<char>)->Apply(run_sizes);
-BENCHMARK(BM_std_minmax<short>)->Apply(run_sizes);
-BENCHMARK(BM_std_minmax<int>)->Apply(run_sizes);
-BENCHMARK(BM_std_minmax<long long>)->Apply(run_sizes);
-BENCHMARK(BM_std_minmax<unsigned char>)->Apply(run_sizes);
-BENCHMARK(BM_std_minmax<unsigned short>)->Apply(run_sizes);
-BENCHMARK(BM_std_minmax<unsigned int>)->Apply(run_sizes);
-BENCHMARK(BM_std_minmax<unsigned long long>)->Apply(run_sizes);
+  bm(std::type_identity<std::vector<char>>(), "ranges::minmax(std::vector<char>)");
+  bm(std::type_identity<std::vector<long long>>(), "ranges::minmax(std::vector<long long>)");
+  bm(std::type_identity<std::vector<__int128>>(), "ranges::minmax(std::vector<__int128>)");
+  bm(std::type_identity<std::vector<unsigned __int128>>(), "ranges::minmax(std::vector<__int128>)");
 
-BENCHMARK_MAIN();
+  bm(std::type_identity<std::deque<char>>(), "ranges::minmax(std::deque<char>)");
+  bm(std::type_identity<std::deque<long long>>(), "ranges::minmax(std::deque<long long>)");
+  bm(std::type_identity<std::deque<__int128>>(), "ranges::minmax(std::deque<__int128>)");
+  bm(std::type_identity<std::deque<unsigned __int128>>(), "ranges::minmax(std::deque<__int128>)");
+
+  benchmark::Initialize(&argc, argv);
+  benchmark::RunSpecifiedBenchmarks();
+  benchmark::Shutdown();
+  return 0;
+}



More information about the libcxx-commits mailing list