From 4946677ee7beb8cd6d673d39e226df981230a11a Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Tue, 19 Aug 2025 10:15:34 +0300 Subject: [PATCH 1/4] benchmark --- benchmarks/CMakeLists.txt | 1 + benchmarks/src/vector_bool_count.cpp | 38 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 benchmarks/src/vector_bool_count.cpp diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index caab5625c60..19725af4974 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -134,5 +134,6 @@ add_benchmark(sv_equal src/sv_equal.cpp) add_benchmark(swap_ranges src/swap_ranges.cpp) add_benchmark(unique src/unique.cpp) add_benchmark(vector_bool_copy src/vector_bool_copy.cpp) +add_benchmark(vector_bool_count src/vector_bool_count.cpp) add_benchmark(vector_bool_copy_n src/vector_bool_copy_n.cpp) add_benchmark(vector_bool_move src/vector_bool_move.cpp) diff --git a/benchmarks/src/vector_bool_count.cpp b/benchmarks/src/vector_bool_count.cpp new file mode 100644 index 00000000000..6b9b945b0fd --- /dev/null +++ b/benchmarks/src/vector_bool_count.cpp @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include +// +#include +#include +#include +#include + +using namespace std; + +vector createRandomVector(const size_t size) { + static mt19937 gen; + vector result(size); + generate_n(result.begin(), size, [] { return bernoulli_distribution{0.5}(gen); }); + return result; +} + +void count_aligned(benchmark::State& state) { + const auto size = static_cast(state.range(0)); + vector v = createRandomVector(size); + + bool b = false; + + for (auto _ : state) { + benchmark::DoNotOptimize(b); + benchmark::DoNotOptimize(v); + auto r = count(v.cbegin(), v.cend(), b); + benchmark::DoNotOptimize(r); + b = !b; + } +} + + +BENCHMARK(count_aligned)->RangeMultiplier(64)->Range(64, 64 << 10); + +BENCHMARK_MAIN(); From b316ef442cc094904643fa744c92dcf5855623de Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 22 Aug 2025 12:34:53 -0700 Subject: [PATCH 2/4] Sort the benchmarks. --- benchmarks/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index 19725af4974..5f7afec336c 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -134,6 +134,6 @@ add_benchmark(sv_equal src/sv_equal.cpp) add_benchmark(swap_ranges src/swap_ranges.cpp) add_benchmark(unique src/unique.cpp) add_benchmark(vector_bool_copy src/vector_bool_copy.cpp) -add_benchmark(vector_bool_count src/vector_bool_count.cpp) add_benchmark(vector_bool_copy_n src/vector_bool_copy_n.cpp) +add_benchmark(vector_bool_count src/vector_bool_count.cpp) add_benchmark(vector_bool_move src/vector_bool_move.cpp) From 19e42820c1e5f033c4a75812c27678de4dd19585 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 22 Aug 2025 12:39:05 -0700 Subject: [PATCH 3/4] Simplify generation. --- benchmarks/src/vector_bool_count.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/benchmarks/src/vector_bool_count.cpp b/benchmarks/src/vector_bool_count.cpp index 6b9b945b0fd..4a508667fd6 100644 --- a/benchmarks/src/vector_bool_count.cpp +++ b/benchmarks/src/vector_bool_count.cpp @@ -12,8 +12,9 @@ using namespace std; vector createRandomVector(const size_t size) { static mt19937 gen; + static bernoulli_distribution dist{0.5}; vector result(size); - generate_n(result.begin(), size, [] { return bernoulli_distribution{0.5}(gen); }); + generate(result.begin(), result.end(), [] { return dist(gen); }); return result; } From 068c06e0fcba58373fe623e17d24d332a7e35b16 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sat, 23 Aug 2025 12:22:03 +0300 Subject: [PATCH 4/4] Capture dist and gen by reference instead of using local static * Predictable sequence in each benchmark case regardless of other cases * Potentially ninor perf improvement by avoiding magic static --- benchmarks/src/vector_bool_count.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmarks/src/vector_bool_count.cpp b/benchmarks/src/vector_bool_count.cpp index 4a508667fd6..1d8f174a37e 100644 --- a/benchmarks/src/vector_bool_count.cpp +++ b/benchmarks/src/vector_bool_count.cpp @@ -11,10 +11,10 @@ using namespace std; vector createRandomVector(const size_t size) { - static mt19937 gen; - static bernoulli_distribution dist{0.5}; + mt19937 gen; + bernoulli_distribution dist{0.5}; vector result(size); - generate(result.begin(), result.end(), [] { return dist(gen); }); + generate(result.begin(), result.end(), [&] { return dist(gen); }); return result; }