From 72f834df1b90e70eb2638cdc761a08156e4f3974 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 7 Jul 2024 10:59:39 +0300 Subject: [PATCH 1/5] Missing optimization barriers --- benchmarks/src/bitset_to_string.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/benchmarks/src/bitset_to_string.cpp b/benchmarks/src/bitset_to_string.cpp index c5f012c6a18..462409ab5c3 100644 --- a/benchmarks/src/bitset_to_string.cpp +++ b/benchmarks/src/bitset_to_string.cpp @@ -26,6 +26,7 @@ namespace { void BM_bitset_to_string(benchmark::State& state) { for (auto _ : state) { for (const auto& bits : random_bits) { + benchmark::DoNotOptimize(bits); bitset bs{bits}; benchmark::DoNotOptimize(bs.to_string()); } @@ -36,6 +37,7 @@ namespace { void BM_bitset_to_string_large_single(benchmark::State& state) { const auto large_bitset = bit_cast>(random_bits); for (auto _ : state) { + benchmark::DoNotOptimize(large_bitset); benchmark::DoNotOptimize(large_bitset.to_string()); } } From 4ff5a4a15303dba7dbbfa4d1fc9e3a9f3db2b11c Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 7 Jul 2024 12:34:21 +0300 Subject: [PATCH 2/5] Fix bitset<512> benchmark correctness --- benchmarks/src/bitset_to_string.cpp | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/benchmarks/src/bitset_to_string.cpp b/benchmarks/src/bitset_to_string.cpp index 462409ab5c3..ad4133d6028 100644 --- a/benchmarks/src/bitset_to_string.cpp +++ b/benchmarks/src/bitset_to_string.cpp @@ -13,19 +13,25 @@ using namespace std; namespace { - const auto random_bits = [] { + template + const auto random_bits_init() { mt19937_64 rnd{}; - array arr; + array arr; for (auto& d : arr) { d = rnd(); } return arr; - }(); + } + + template + const auto random_bits = random_bits_init(); template void BM_bitset_to_string(benchmark::State& state) { + static_assert(N <= 64); + for (auto _ : state) { - for (const auto& bits : random_bits) { + for (const auto& bits : random_bits<>) { benchmark::DoNotOptimize(bits); bitset bs{bits}; benchmark::DoNotOptimize(bs.to_string()); @@ -33,9 +39,12 @@ namespace { } } - template + template void BM_bitset_to_string_large_single(benchmark::State& state) { - const auto large_bitset = bit_cast>(random_bits); + static_assert(N % 64 == 0 && N >= 64); + const auto& bitset_data = random_bits; + + const auto large_bitset = bit_cast>(bitset_data); for (auto _ : state) { benchmark::DoNotOptimize(large_bitset); benchmark::DoNotOptimize(large_bitset.to_string()); @@ -45,11 +54,11 @@ namespace { BENCHMARK(BM_bitset_to_string<15, char>); BENCHMARK(BM_bitset_to_string<64, char>); -BENCHMARK(BM_bitset_to_string<512, char>); -BENCHMARK(BM_bitset_to_string_large_single); +BENCHMARK(BM_bitset_to_string_large_single<512, char>); +BENCHMARK(BM_bitset_to_string_large_single<2048, char>); BENCHMARK(BM_bitset_to_string<7, wchar_t>); BENCHMARK(BM_bitset_to_string<64, wchar_t>); -BENCHMARK(BM_bitset_to_string<512, wchar_t>); -BENCHMARK(BM_bitset_to_string_large_single); +BENCHMARK(BM_bitset_to_string_large_single<512, wchar_t>); +BENCHMARK(BM_bitset_to_string_large_single<2048, wchar_t>); BENCHMARK_MAIN(); From ef7477745f3beba70a4b2aea68e8913193f617f5 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 8 Jul 2024 08:55:48 -0700 Subject: [PATCH 3/5] Don't return const prvalues. --- benchmarks/src/bitset_to_string.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/src/bitset_to_string.cpp b/benchmarks/src/bitset_to_string.cpp index ad4133d6028..ea81f2b4c57 100644 --- a/benchmarks/src/bitset_to_string.cpp +++ b/benchmarks/src/bitset_to_string.cpp @@ -14,7 +14,7 @@ using namespace std; namespace { template - const auto random_bits_init() { + auto random_bits_init() { mt19937_64 rnd{}; array arr; for (auto& d : arr) { From 7789d638c410f390892beb856479059594ed0042 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 8 Jul 2024 08:57:36 -0700 Subject: [PATCH 4/5] N is an exact multiple of 64, so (N / 64) * 64 is N. --- benchmarks/src/bitset_to_string.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/src/bitset_to_string.cpp b/benchmarks/src/bitset_to_string.cpp index ea81f2b4c57..c578294a180 100644 --- a/benchmarks/src/bitset_to_string.cpp +++ b/benchmarks/src/bitset_to_string.cpp @@ -44,7 +44,7 @@ namespace { static_assert(N % 64 == 0 && N >= 64); const auto& bitset_data = random_bits; - const auto large_bitset = bit_cast>(bitset_data); + const auto large_bitset = bit_cast>(bitset_data); for (auto _ : state) { benchmark::DoNotOptimize(large_bitset); benchmark::DoNotOptimize(large_bitset.to_string()); From 17b1930b8da22134c5770c7276fb82ac1d74dd8f Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 8 Jul 2024 09:01:50 -0700 Subject: [PATCH 5/5] Distinguish Elems from N. --- benchmarks/src/bitset_to_string.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/benchmarks/src/bitset_to_string.cpp b/benchmarks/src/bitset_to_string.cpp index c578294a180..5fc88147839 100644 --- a/benchmarks/src/bitset_to_string.cpp +++ b/benchmarks/src/bitset_to_string.cpp @@ -13,18 +13,18 @@ using namespace std; namespace { - template + template auto random_bits_init() { mt19937_64 rnd{}; - array arr; + array arr; for (auto& d : arr) { d = rnd(); } return arr; } - template - const auto random_bits = random_bits_init(); + template + const auto random_bits = random_bits_init(); template void BM_bitset_to_string(benchmark::State& state) {