From 16243f7ae9c57fc4f778c34240ef4fc3446dd00e Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 27 Mar 2025 01:03:36 -0700 Subject: [PATCH 01/12] google-benchmark 1.9.2. --- benchmarks/google-benchmark | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/google-benchmark b/benchmarks/google-benchmark index c58e6d07105..afa23b7699c 160000 --- a/benchmarks/google-benchmark +++ b/benchmarks/google-benchmark @@ -1 +1 @@ -Subproject commit c58e6d0710581e3a08d65c349664128a8d9a2461 +Subproject commit afa23b7699c17f1e26c88cbf95257b20d78d6247 From b9ed0385d9e1d8e771011ec12b3ff93c6122d708 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 27 Mar 2025 01:08:22 -0700 Subject: [PATCH 02/12] Remove HAVE_GNU_POSIX_REGEX and HAVE_POSIX_REGEX workarounds. These were added in GH 3151 to silence "verbose and scary-looking (but ultimately innocuous) messages". --- benchmarks/CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index b551efa42cc..74d1259d9fe 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -72,9 +72,6 @@ set(BENCHMARK_ENABLE_DOXYGEN OFF) set(BENCHMARK_ENABLE_INSTALL OFF) set(BENCHMARK_ENABLE_TESTING OFF) -set(HAVE_GNU_POSIX_REGEX OFF) -set(HAVE_POSIX_REGEX OFF) - add_subdirectory(google-benchmark EXCLUDE_FROM_ALL) set(benchmark_headers From b61add4b4aae272978d7d7fae49d7c17f95c97ab Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 27 Mar 2025 01:17:20 -0700 Subject: [PATCH 03/12] Move/rename inconsistent `vector` benchmarks. --- benchmarks/CMakeLists.txt | 7 +++---- .../vector.bool/copy/test.cpp => vector_bool_copy.cpp} | 0 .../vector.bool/copy_n/test.cpp => vector_bool_copy_n.cpp} | 0 .../vector.bool/move/test.cpp => vector_bool_move.cpp} | 0 4 files changed, 3 insertions(+), 4 deletions(-) rename benchmarks/src/{std/containers/sequences/vector.bool/copy/test.cpp => vector_bool_copy.cpp} (100%) rename benchmarks/src/{std/containers/sequences/vector.bool/copy_n/test.cpp => vector_bool_copy_n.cpp} (100%) rename benchmarks/src/{std/containers/sequences/vector.bool/move/test.cpp => vector_bool_move.cpp} (100%) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index 74d1259d9fe..85e779d9b41 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -127,7 +127,6 @@ add_benchmark(std_copy src/std_copy.cpp) 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/std/containers/sequences/vector.bool/copy/test.cpp) -add_benchmark(vector_bool_copy_n src/std/containers/sequences/vector.bool/copy_n/test.cpp) -add_benchmark(vector_bool_move src/std/containers/sequences/vector.bool/move/test.cpp) +add_benchmark(vector_bool_copy src/vector_bool_copy.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/std/containers/sequences/vector.bool/copy/test.cpp b/benchmarks/src/vector_bool_copy.cpp similarity index 100% rename from benchmarks/src/std/containers/sequences/vector.bool/copy/test.cpp rename to benchmarks/src/vector_bool_copy.cpp diff --git a/benchmarks/src/std/containers/sequences/vector.bool/copy_n/test.cpp b/benchmarks/src/vector_bool_copy_n.cpp similarity index 100% rename from benchmarks/src/std/containers/sequences/vector.bool/copy_n/test.cpp rename to benchmarks/src/vector_bool_copy_n.cpp diff --git a/benchmarks/src/std/containers/sequences/vector.bool/move/test.cpp b/benchmarks/src/vector_bool_move.cpp similarity index 100% rename from benchmarks/src/std/containers/sequences/vector.bool/move/test.cpp rename to benchmarks/src/vector_bool_move.cpp From 47a162cfe6e76468e264566ddfdb9697732ac978 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 27 Mar 2025 01:24:15 -0700 Subject: [PATCH 04/12] Stop using random_device, part 1. --- benchmarks/src/random_integer_generation.cpp | 2 +- benchmarks/src/vector_bool_copy.cpp | 2 +- benchmarks/src/vector_bool_copy_n.cpp | 2 +- benchmarks/src/vector_bool_move.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/benchmarks/src/random_integer_generation.cpp b/benchmarks/src/random_integer_generation.cpp index ebe5d668738..b51062dbd01 100644 --- a/benchmarks/src/random_integer_generation.cpp +++ b/benchmarks/src/random_integer_generation.cpp @@ -32,7 +32,7 @@ static void BM_lcg(benchmark::State& state) { BENCHMARK(BM_lcg); std::uint32_t GetMax() { - std::random_device gen; + std::mt19937 gen; std::uniform_int_distribution dist(10'000'000, 20'000'000); return dist(gen); } diff --git a/benchmarks/src/vector_bool_copy.cpp b/benchmarks/src/vector_bool_copy.cpp index 18e18244514..46fbb4ee92a 100644 --- a/benchmarks/src/vector_bool_copy.cpp +++ b/benchmarks/src/vector_bool_copy.cpp @@ -11,7 +11,7 @@ using namespace std; static vector createRandomVector(const size_t size) { - static mt19937 gen{random_device{}()}; + static mt19937 gen; vector result(size); generate_n(result.begin(), size, [] { return bernoulli_distribution{0.5}(gen); }); return result; diff --git a/benchmarks/src/vector_bool_copy_n.cpp b/benchmarks/src/vector_bool_copy_n.cpp index fe52c7036cf..de5c670d993 100644 --- a/benchmarks/src/vector_bool_copy_n.cpp +++ b/benchmarks/src/vector_bool_copy_n.cpp @@ -11,7 +11,7 @@ using namespace std; static vector createRandomVector(const size_t size) { - static mt19937 gen{random_device{}()}; + static mt19937 gen; vector result(size); generate_n(result.begin(), size, [] { return bernoulli_distribution{0.5}(gen); }); return result; diff --git a/benchmarks/src/vector_bool_move.cpp b/benchmarks/src/vector_bool_move.cpp index 7eefc268ec2..32a9ba1be52 100644 --- a/benchmarks/src/vector_bool_move.cpp +++ b/benchmarks/src/vector_bool_move.cpp @@ -11,7 +11,7 @@ using namespace std; static vector createRandomVector(const size_t size) { - static mt19937 gen{random_device{}()}; + static mt19937 gen; vector result(size); generate_n(result.begin(), size, [] { return bernoulli_distribution{0.5}(gen); }); return result; From 63f1ce2ecaaee69ebbc820e131af7316696e971f Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 27 Mar 2025 01:35:09 -0700 Subject: [PATCH 05/12] Stop using random_device, part 2: Remove xoshiro. --- NOTICE.txt | 10 --------- benchmarks/CMakeLists.txt | 1 - benchmarks/inc/utility.hpp | 9 ++------ benchmarks/inc/xoshiro.hpp | 42 -------------------------------------- 4 files changed, 2 insertions(+), 60 deletions(-) delete mode 100644 benchmarks/inc/xoshiro.hpp diff --git a/NOTICE.txt b/NOTICE.txt index 4a81a50be05..8c846a8667a 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -216,13 +216,3 @@ In addition, certain files include the notices provided below. // shall not be used in advertising or otherwise to promote the sale, // use or other dealings in these Data Files or Software without prior // written authorization of the copyright holder. - ----------------------- - -/* Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org) - -To the extent possible under law, the author has dedicated all copyright -and related and neighboring rights to this software to the public domain -worldwide. This software is distributed without any warranty. - -See . */ diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index 85e779d9b41..a020e4d133f 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -77,7 +77,6 @@ add_subdirectory(google-benchmark EXCLUDE_FROM_ALL) set(benchmark_headers "inc/udt.hpp" "inc/utility.hpp" - "inc/xoshiro.hpp" ) function(add_benchmark name) diff --git a/benchmarks/inc/utility.hpp b/benchmarks/inc/utility.hpp index ecfe0890a16..eacb3fc6d36 100644 --- a/benchmarks/inc/utility.hpp +++ b/benchmarks/inc/utility.hpp @@ -5,17 +5,12 @@ #include #include -#include #include #include -#include - template std::vector random_vector(size_t n) { - std::random_device rd; - std::uniform_int_distribution id64; - xoshiro256ss prng{id64(rd), id64(rd), id64(rd), id64(rd)}; + std::mt19937_64 prng; std::vector res(n); @@ -25,7 +20,7 @@ std::vector random_vector(size_t n) { // but is insufficient for aggregate or non_trivial. #pragma warning(push) #pragma warning(disable : 4244) // warning C4244: conversion from 'uint64_t' to 'Data', possible loss of data - std::generate(res.begin(), res.end(), [&prng] { return static_cast(prng.next()); }); + std::generate(res.begin(), res.end(), [&prng] { return static_cast(prng()); }); #pragma warning(pop) return res; diff --git a/benchmarks/inc/xoshiro.hpp b/benchmarks/inc/xoshiro.hpp deleted file mode 100644 index 3a302105da0..00000000000 --- a/benchmarks/inc/xoshiro.hpp +++ /dev/null @@ -1,42 +0,0 @@ -/* Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org) - -To the extent possible under law, the author has dedicated all copyright -and related and neighboring rights to this software to the public domain -worldwide. This software is distributed without any warranty. - -See . -SPDX-License-Identifier: CC0-1.0 */ - -#pragma once - -#include -#include - -struct xoshiro256ss { - xoshiro256ss() = delete; - xoshiro256ss(std::uint64_t s0, std::uint64_t s1, std::uint64_t s2, std::uint64_t s3) - : s0_(s0), s1_(s1), s2_(s2), s3_(s3) {} - - std::uint64_t next() { - auto result = std::rotl(s1_ * 5, 7) * 9; - - const std::uint64_t t = s1_ << 17; - - s2_ ^= s0_; - s3_ ^= s1_; - s1_ ^= s2_; - s0_ ^= s3_; - - s2_ ^= t; - - s3_ = std::rotl(s3_, 45); - - return result; - } - -private: - std::uint64_t s0_; - std::uint64_t s1_; - std::uint64_t s2_; - std::uint64_t s3_; -}; From 6f5992387f7455c7ac6f8c11124b14f7b62d0406 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 27 Mar 2025 01:38:01 -0700 Subject: [PATCH 06/12] Add missing files to benchmark_headers. --- benchmarks/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index a020e4d133f..83dc231f1e1 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -75,6 +75,8 @@ set(BENCHMARK_ENABLE_TESTING OFF) add_subdirectory(google-benchmark EXCLUDE_FROM_ALL) set(benchmark_headers + "inc/lorem.hpp" + "inc/skewed_allocator.hpp" "inc/udt.hpp" "inc/utility.hpp" ) From 0da47758afc66c3486d57710427b2ffe65799504 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 27 Mar 2025 01:40:01 -0700 Subject: [PATCH 07/12] Remove STL_BENCHMARK_ITERATOR_DEBUG_LEVEL. We've never been interested in benchmarking non-default settings (or debug). --- benchmarks/CMakeLists.txt | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index 83dc231f1e1..b2993108b72 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -46,19 +46,6 @@ set_property(CACHE STL_BENCHMARK_MSVC_RUNTIME_LIBRARY ) set(CMAKE_MSVC_RUNTIME_LIBRARY "${STL_BENCHMARK_MSVC_RUNTIME_LIBRARY}") -set(STL_BENCHMARK_ITERATOR_DEBUG_LEVEL - default - CACHE STRING "What level of iterator debugging to use." -) -set_property(CACHE STL_BENCHMARK_ITERATOR_DEBUG_LEVEL - PROPERTY STRINGS - "default;0;1;2" -) - -if(NOT STL_BENCHMARK_ITERATOR_DEBUG_LEVEL STREQUAL "default") - add_compile_definitions("_ITERATOR_DEBUG_LEVEL=${STL_BENCHMARK_ITERATOR_DEBUG_LEVEL}") -endif() - set(CMAKE_BUILD_TYPE RelWithDebInfo) # /utf-8 affects . From d7191ee0015e52c0b0600e6a532121ff2418cc93 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 27 Mar 2025 01:50:10 -0700 Subject: [PATCH 08/12] Remove unnecessary `static`. --- benchmarks/src/locale_classic.cpp | 2 +- benchmarks/src/random_integer_generation.cpp | 20 ++++++++++---------- benchmarks/src/vector_bool_copy.cpp | 16 ++++++++-------- benchmarks/src/vector_bool_copy_n.cpp | 16 ++++++++-------- benchmarks/src/vector_bool_move.cpp | 16 ++++++++-------- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/benchmarks/src/locale_classic.cpp b/benchmarks/src/locale_classic.cpp index 0f2e9527cd7..cac18e5a15f 100644 --- a/benchmarks/src/locale_classic.cpp +++ b/benchmarks/src/locale_classic.cpp @@ -6,7 +6,7 @@ using namespace std; // GH-3048 : Double-checked locking for locale::classic -static void BM_locale_classic(benchmark::State& state) { +void BM_locale_classic(benchmark::State& state) { for (auto _ : state) { benchmark::DoNotOptimize(locale::classic()); } diff --git a/benchmarks/src/random_integer_generation.cpp b/benchmarks/src/random_integer_generation.cpp index b51062dbd01..9c1615a5bc1 100644 --- a/benchmarks/src/random_integer_generation.cpp +++ b/benchmarks/src/random_integer_generation.cpp @@ -7,7 +7,7 @@ /// Test URBGs alone -static void BM_mt19937(benchmark::State& state) { +void BM_mt19937(benchmark::State& state) { std::mt19937 gen; for (auto _ : state) { benchmark::DoNotOptimize(gen()); @@ -15,7 +15,7 @@ static void BM_mt19937(benchmark::State& state) { } BENCHMARK(BM_mt19937); -static void BM_mt19937_64(benchmark::State& state) { +void BM_mt19937_64(benchmark::State& state) { std::mt19937_64 gen; for (auto _ : state) { benchmark::DoNotOptimize(gen()); @@ -23,7 +23,7 @@ static void BM_mt19937_64(benchmark::State& state) { } BENCHMARK(BM_mt19937_64); -static void BM_lcg(benchmark::State& state) { +void BM_lcg(benchmark::State& state) { std::minstd_rand gen; for (auto _ : state) { benchmark::DoNotOptimize(gen()); @@ -37,11 +37,11 @@ std::uint32_t GetMax() { return dist(gen); } -static const std::uint32_t maximum = GetMax(); // random divisor to prevent strength reduction +const std::uint32_t maximum = GetMax(); // random divisor to prevent strength reduction /// Test mt19937 -static void BM_raw_mt19937_old(benchmark::State& state) { +void BM_raw_mt19937_old(benchmark::State& state) { std::mt19937 gen; std::_Rng_from_urng rng(gen); for (auto _ : state) { @@ -50,7 +50,7 @@ static void BM_raw_mt19937_old(benchmark::State& state) { } BENCHMARK(BM_raw_mt19937_old); -static void BM_raw_mt19937_new(benchmark::State& state) { +void BM_raw_mt19937_new(benchmark::State& state) { std::mt19937 gen; std::_Rng_from_urng_v2 rng(gen); for (auto _ : state) { @@ -61,7 +61,7 @@ BENCHMARK(BM_raw_mt19937_new); /// Test mt19937_64 -static void BM_raw_mt19937_64_old(benchmark::State& state) { +void BM_raw_mt19937_64_old(benchmark::State& state) { std::mt19937_64 gen; std::_Rng_from_urng rng(gen); for (auto _ : state) { @@ -70,7 +70,7 @@ static void BM_raw_mt19937_64_old(benchmark::State& state) { } BENCHMARK(BM_raw_mt19937_64_old); -static void BM_raw_mt19937_64_new(benchmark::State& state) { +void BM_raw_mt19937_64_new(benchmark::State& state) { std::mt19937_64 gen; std::_Rng_from_urng_v2 rng(gen); for (auto _ : state) { @@ -81,7 +81,7 @@ BENCHMARK(BM_raw_mt19937_64_new); /// Test minstd_rand -static void BM_raw_lcg_old(benchmark::State& state) { +void BM_raw_lcg_old(benchmark::State& state) { std::minstd_rand gen; std::_Rng_from_urng rng(gen); for (auto _ : state) { @@ -90,7 +90,7 @@ static void BM_raw_lcg_old(benchmark::State& state) { } BENCHMARK(BM_raw_lcg_old); -static void BM_raw_lcg_new(benchmark::State& state) { +void BM_raw_lcg_new(benchmark::State& state) { std::minstd_rand gen; std::_Rng_from_urng_v2 rng(gen); for (auto _ : state) { diff --git a/benchmarks/src/vector_bool_copy.cpp b/benchmarks/src/vector_bool_copy.cpp index 46fbb4ee92a..6cfc2b4f95f 100644 --- a/benchmarks/src/vector_bool_copy.cpp +++ b/benchmarks/src/vector_bool_copy.cpp @@ -10,14 +10,14 @@ using namespace std; -static vector createRandomVector(const size_t size) { +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; } -static void copy_block_aligned(benchmark::State& state) { +void copy_block_aligned(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -27,7 +27,7 @@ static void copy_block_aligned(benchmark::State& state) { } } -static void copy_source_misaligned(benchmark::State& state) { +void copy_source_misaligned(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -37,7 +37,7 @@ static void copy_source_misaligned(benchmark::State& state) { } } -static void copy_dest_misaligned(benchmark::State& state) { +void copy_dest_misaligned(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -48,7 +48,7 @@ static void copy_dest_misaligned(benchmark::State& state) { } // Special benchmark for matching char alignment -static void copy_matching_alignment(benchmark::State& state) { +void copy_matching_alignment(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -59,7 +59,7 @@ static void copy_matching_alignment(benchmark::State& state) { } // Special benchmarks for single block corner case -static void copy_both_single_blocks(benchmark::State& state) { +void copy_both_single_blocks(benchmark::State& state) { const vector source = createRandomVector(50); vector dest(50, false); @@ -69,7 +69,7 @@ static void copy_both_single_blocks(benchmark::State& state) { } } -static void copy_source_single_block(benchmark::State& state) { +void copy_source_single_block(benchmark::State& state) { const vector source = createRandomVector(50); vector dest(50, false); @@ -79,7 +79,7 @@ static void copy_source_single_block(benchmark::State& state) { } } -static void copy_dest_single_block(benchmark::State& state) { +void copy_dest_single_block(benchmark::State& state) { const vector source = createRandomVector(50); vector dest(50, false); diff --git a/benchmarks/src/vector_bool_copy_n.cpp b/benchmarks/src/vector_bool_copy_n.cpp index de5c670d993..9952c261091 100644 --- a/benchmarks/src/vector_bool_copy_n.cpp +++ b/benchmarks/src/vector_bool_copy_n.cpp @@ -10,14 +10,14 @@ using namespace std; -static vector createRandomVector(const size_t size) { +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; } -static void copy_n_block_aligned(benchmark::State& state) { +void copy_n_block_aligned(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -27,7 +27,7 @@ static void copy_n_block_aligned(benchmark::State& state) { } } -static void copy_n_source_misaligned(benchmark::State& state) { +void copy_n_source_misaligned(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -37,7 +37,7 @@ static void copy_n_source_misaligned(benchmark::State& state) { } } -static void copy_n_dest_misaligned(benchmark::State& state) { +void copy_n_dest_misaligned(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -48,7 +48,7 @@ static void copy_n_dest_misaligned(benchmark::State& state) { } // Special benchmark for matching char alignment -static void copy_n_matching_alignment(benchmark::State& state) { +void copy_n_matching_alignment(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -59,7 +59,7 @@ static void copy_n_matching_alignment(benchmark::State& state) { } // Special benchmarks for single block corner case -static void copy_n_both_single_blocks(benchmark::State& state) { +void copy_n_both_single_blocks(benchmark::State& state) { const vector source = createRandomVector(50); vector dest(50, false); @@ -69,7 +69,7 @@ static void copy_n_both_single_blocks(benchmark::State& state) { } } -static void copy_n_source_single_block(benchmark::State& state) { +void copy_n_source_single_block(benchmark::State& state) { const vector source = createRandomVector(50); vector dest(50, false); @@ -79,7 +79,7 @@ static void copy_n_source_single_block(benchmark::State& state) { } } -static void copy_n_dest_single_block(benchmark::State& state) { +void copy_n_dest_single_block(benchmark::State& state) { const vector source = createRandomVector(50); vector dest(50, false); diff --git a/benchmarks/src/vector_bool_move.cpp b/benchmarks/src/vector_bool_move.cpp index 32a9ba1be52..56485c53b8c 100644 --- a/benchmarks/src/vector_bool_move.cpp +++ b/benchmarks/src/vector_bool_move.cpp @@ -10,14 +10,14 @@ using namespace std; -static vector createRandomVector(const size_t size) { +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; } -static void move_block_aligned(benchmark::State& state) { +void move_block_aligned(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -27,7 +27,7 @@ static void move_block_aligned(benchmark::State& state) { } } -static void move_source_misaligned(benchmark::State& state) { +void move_source_misaligned(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -37,7 +37,7 @@ static void move_source_misaligned(benchmark::State& state) { } } -static void move_dest_misaligned(benchmark::State& state) { +void move_dest_misaligned(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -48,7 +48,7 @@ static void move_dest_misaligned(benchmark::State& state) { } // Special benchmark for matching char alignment -static void move_matching_alignment(benchmark::State& state) { +void move_matching_alignment(benchmark::State& state) { const auto size = static_cast(state.range(0)); const vector source = createRandomVector(size); vector dest(size, false); @@ -59,7 +59,7 @@ static void move_matching_alignment(benchmark::State& state) { } // Special benchmarks for single block corner case -static void move_both_single_blocks(benchmark::State& state) { +void move_both_single_blocks(benchmark::State& state) { const vector source = createRandomVector(50); vector dest(50, false); @@ -69,7 +69,7 @@ static void move_both_single_blocks(benchmark::State& state) { } } -static void move_source_single_block(benchmark::State& state) { +void move_source_single_block(benchmark::State& state) { const vector source = createRandomVector(50); vector dest(50, false); @@ -79,7 +79,7 @@ static void move_source_single_block(benchmark::State& state) { } } -static void move_dest_single_block(benchmark::State& state) { +void move_dest_single_block(benchmark::State& state) { const vector source = createRandomVector(50); vector dest(50, false); From 962796ff0b9d1671f51848c62ebdcda407734253 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 27 Mar 2025 01:51:35 -0700 Subject: [PATCH 09/12] Remove unnecessary unnamed namespaces. --- benchmarks/src/bitset_from_string.cpp | 139 +++++++++--------- benchmarks/src/bitset_to_string.cpp | 58 ++++---- benchmarks/src/efficient_nonlocking_print.cpp | 46 +++--- benchmarks/src/path_lexically_normal.cpp | 30 ++-- benchmarks/src/priority_queue_push_range.cpp | 80 +++++----- benchmarks/src/std_copy.cpp | 131 ++++++++--------- 6 files changed, 235 insertions(+), 249 deletions(-) diff --git a/benchmarks/src/bitset_from_string.cpp b/benchmarks/src/bitset_from_string.cpp index 6626e9bad7e..cf0c48b52d3 100644 --- a/benchmarks/src/bitset_from_string.cpp +++ b/benchmarks/src/bitset_from_string.cpp @@ -12,89 +12,86 @@ using namespace std; -namespace { - template - auto random_digits_init() { - mt19937_64 rnd{}; - uniform_int_distribution<> dis('0', '1'); +template +auto random_digits_init() { + mt19937_64 rnd{}; + uniform_int_distribution<> dis('0', '1'); - constexpr size_t number_of_bitsets = (Min_length + N - 1) / N; - static_assert(number_of_bitsets != 0); + constexpr size_t number_of_bitsets = (Min_length + N - 1) / N; + static_assert(number_of_bitsets != 0); - constexpr size_t actual_size = number_of_bitsets * (N + 1); // +1 for \0 + constexpr size_t actual_size = number_of_bitsets * (N + 1); // +1 for \0 - array result; + array result; - for (size_t i = 0; i < actual_size; ++i) { - if (i % (N + 1) == N) { - result[i] = charT{'\0'}; // write null terminators - } else { - result[i] = static_cast(dis(rnd)); // fill random digits - } + for (size_t i = 0; i < actual_size; ++i) { + if (i % (N + 1) == N) { + result[i] = charT{'\0'}; // write null terminators + } else { + result[i] = static_cast(dis(rnd)); // fill random digits } - - return result; } - enum class length_type : bool { char_count, null_term }; - - template - const auto random_digits = random_digits_init(); - - template - void bitset_from_string(benchmark::State& state) { - const auto& digit_array = random_digits; - for (auto _ : state) { - benchmark::DoNotOptimize(digit_array); - const auto arr_data = digit_array.data(); - const auto arr_size = digit_array.size(); - for (size_t pos = 0; pos != arr_size; pos += N + 1) { - if constexpr (Length == length_type::char_count) { - bitset bs(arr_data + pos, N); - benchmark::DoNotOptimize(bs); - } else { - bitset bs(arr_data + pos); - benchmark::DoNotOptimize(bs); - } + return result; +} + +enum class length_type : bool { char_count, null_term }; + +template +const auto random_digits = random_digits_init(); + +template +void bitset_from_string(benchmark::State& state) { + const auto& digit_array = random_digits; + for (auto _ : state) { + benchmark::DoNotOptimize(digit_array); + const auto arr_data = digit_array.data(); + const auto arr_size = digit_array.size(); + for (size_t pos = 0; pos != arr_size; pos += N + 1) { + if constexpr (Length == length_type::char_count) { + bitset bs(arr_data + pos, N); + benchmark::DoNotOptimize(bs); + } else { + bitset bs(arr_data + pos); + benchmark::DoNotOptimize(bs); } } } - - template - basic_string random_digits_contiguous_string_init() { - mt19937_64 rnd{}; - uniform_int_distribution<> dis('0', '1'); - - basic_string result; - - result.resize_and_overwrite(Length, [&](charT* ptr, size_t) { - generate_n(ptr, Length, [&] { return static_cast(dis(rnd)); }); - return Length; - }); - - return result; - } - - template - const auto random_digits_contiguous_string = random_digits_contiguous_string_init(); - - template - void bitset_from_stream(benchmark::State& state) { - constexpr size_t string_length = 2048; - constexpr size_t count = string_length / N; - basic_istringstream stream(random_digits_contiguous_string); - bitset bs; - for (auto _ : state) { - benchmark::DoNotOptimize(stream); - for (size_t i = 0; i != count; ++i) { - stream >> bs; - } - benchmark::DoNotOptimize(bs); - stream.seekg(0); +} + +template +basic_string random_digits_contiguous_string_init() { + mt19937_64 rnd{}; + uniform_int_distribution<> dis('0', '1'); + + basic_string result; + + result.resize_and_overwrite(Length, [&](charT* ptr, size_t) { + generate_n(ptr, Length, [&] { return static_cast(dis(rnd)); }); + return Length; + }); + + return result; +} + +template +const auto random_digits_contiguous_string = random_digits_contiguous_string_init(); + +template +void bitset_from_stream(benchmark::State& state) { + constexpr size_t string_length = 2048; + constexpr size_t count = string_length / N; + basic_istringstream stream(random_digits_contiguous_string); + bitset bs; + for (auto _ : state) { + benchmark::DoNotOptimize(stream); + for (size_t i = 0; i != count; ++i) { + stream >> bs; } + benchmark::DoNotOptimize(bs); + stream.seekg(0); } - -} // namespace +} BENCHMARK(bitset_from_string); BENCHMARK(bitset_from_string); diff --git a/benchmarks/src/bitset_to_string.cpp b/benchmarks/src/bitset_to_string.cpp index 5fc88147839..0dcc1031a7a 100644 --- a/benchmarks/src/bitset_to_string.cpp +++ b/benchmarks/src/bitset_to_string.cpp @@ -12,45 +12,43 @@ using namespace std; -namespace { - template - auto random_bits_init() { - mt19937_64 rnd{}; - array arr; - for (auto& d : arr) { - d = rnd(); - } - return arr; +template +auto random_bits_init() { + mt19937_64 rnd{}; + 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) { - static_assert(N <= 64); +template +void BM_bitset_to_string(benchmark::State& state) { + static_assert(N <= 64); - for (auto _ : state) { - for (const auto& bits : random_bits<>) { - benchmark::DoNotOptimize(bits); - bitset bs{bits}; - benchmark::DoNotOptimize(bs.to_string()); - } + for (auto _ : state) { + for (const auto& bits : random_bits<>) { + benchmark::DoNotOptimize(bits); + bitset bs{bits}; + benchmark::DoNotOptimize(bs.to_string()); } } +} - template - void BM_bitset_to_string_large_single(benchmark::State& state) { - static_assert(N % 64 == 0 && N >= 64); - const auto& bitset_data = random_bits; +template +void BM_bitset_to_string_large_single(benchmark::State& state) { + 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()); - } + const auto large_bitset = bit_cast>(bitset_data); + for (auto _ : state) { + benchmark::DoNotOptimize(large_bitset); + benchmark::DoNotOptimize(large_bitset.to_string()); } -} // namespace +} BENCHMARK(BM_bitset_to_string<15, char>); BENCHMARK(BM_bitset_to_string<64, char>); diff --git a/benchmarks/src/efficient_nonlocking_print.cpp b/benchmarks/src/efficient_nonlocking_print.cpp index d14973ddc9e..1a6381f8436 100644 --- a/benchmarks/src/efficient_nonlocking_print.cpp +++ b/benchmarks/src/efficient_nonlocking_print.cpp @@ -12,33 +12,31 @@ #include #include -namespace { - using PrintType = void (*)(FILE*, std::string_view, std::format_args); +using PrintType = void (*)(FILE*, std::string_view, std::format_args); - template - void BM_vprint(benchmark::State& state) { - for (auto _ : state) { - PrintFunction(stdout, "Hello cool I am going to print as unicode\n", std::make_format_args()); - } +template +void BM_vprint(benchmark::State& state) { + for (auto _ : state) { + PrintFunction(stdout, "Hello cool I am going to print as unicode\n", std::make_format_args()); } - BENCHMARK(BM_vprint<&std::vprint_unicode>); - BENCHMARK(BM_vprint<&std::vprint_unicode_buffered>); +} +BENCHMARK(BM_vprint<&std::vprint_unicode>); +BENCHMARK(BM_vprint<&std::vprint_unicode_buffered>); - template - void BM_vprint_complex(benchmark::State& state) { - const int i = 42; - const std::string str = "Hello world!!!!!!!!!!!!!!!!!!!!!!!!"; - const double f = -902.16283758; - const std::pair p{16, 2.073f}; - for (auto _ : state) { - PrintFunction(stdout, - "Hello cool I am going to print as unicode!! {:X}, {}, {:a}, " - "I am a big string, lots of words, multiple {} formats\n", - std::make_format_args(i, str, f, p)); - } +template +void BM_vprint_complex(benchmark::State& state) { + const int i = 42; + const std::string str = "Hello world!!!!!!!!!!!!!!!!!!!!!!!!"; + const double f = -902.16283758; + const std::pair p{16, 2.073f}; + for (auto _ : state) { + PrintFunction(stdout, + "Hello cool I am going to print as unicode!! {:X}, {}, {:a}, " + "I am a big string, lots of words, multiple {} formats\n", + std::make_format_args(i, str, f, p)); } - BENCHMARK(BM_vprint_complex<&std::vprint_unicode>); - BENCHMARK(BM_vprint_complex<&std::vprint_unicode_buffered>); -} // namespace +} +BENCHMARK(BM_vprint_complex<&std::vprint_unicode>); +BENCHMARK(BM_vprint_complex<&std::vprint_unicode_buffered>); BENCHMARK_MAIN(); diff --git a/benchmarks/src/path_lexically_normal.cpp b/benchmarks/src/path_lexically_normal.cpp index 9b5498ddfa1..24b308ab6c5 100644 --- a/benchmarks/src/path_lexically_normal.cpp +++ b/benchmarks/src/path_lexically_normal.cpp @@ -5,24 +5,22 @@ #include #include -namespace { - void BM_lexically_normal(benchmark::State& state) { - using namespace std::literals; - static constexpr std::wstring_view args[5]{ - LR"(C:Snippets)"sv, - LR"(.\Snippets)"sv, - LR"(..\..\IDE\VC\Snippets)"sv, - LR"(C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\VC\Snippets)"sv, - LR"(/\server/\share/\a/\b/\c/\./\./\d/\../\../\../\../\../\../\../\other/x/y/z/.././..\meow.txt)"sv, - }; +void BM_lexically_normal(benchmark::State& state) { + using namespace std::literals; + static constexpr std::wstring_view args[5]{ + LR"(C:Snippets)"sv, + LR"(.\Snippets)"sv, + LR"(..\..\IDE\VC\Snippets)"sv, + LR"(C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\VC\Snippets)"sv, + LR"(/\server/\share/\a/\b/\c/\./\./\d/\../\../\../\../\../\../\../\other/x/y/z/.././..\meow.txt)"sv, + }; - const auto index = state.range(0); - const std::filesystem::path p(args[index]); - for (auto _ : state) { - benchmark::DoNotOptimize(p.lexically_normal()); - } + const auto index = state.range(0); + const std::filesystem::path p(args[index]); + for (auto _ : state) { + benchmark::DoNotOptimize(p.lexically_normal()); } -} // namespace +} BENCHMARK(BM_lexically_normal)->DenseRange(0, 4, 1); diff --git a/benchmarks/src/priority_queue_push_range.cpp b/benchmarks/src/priority_queue_push_range.cpp index 444d2c2b30d..c15663c90e4 100644 --- a/benchmarks/src/priority_queue_push_range.cpp +++ b/benchmarks/src/priority_queue_push_range.cpp @@ -14,58 +14,56 @@ #include using namespace std; -namespace { - constexpr size_t vec_size = 10'000; +constexpr size_t vec_size = 10'000; - template - auto create_vec(Fn transformation) { - vector vec(vec_size); - for (mt19937_64 rnd(1); auto& e : vec) { - e = transformation(rnd()); - } - return vec; +template +auto create_vec(Fn transformation) { + vector vec(vec_size); + for (mt19937_64 rnd(1); auto& e : vec) { + e = transformation(rnd()); } + return vec; +} - template - T cast_to(uint64_t val) { - return static_cast(val); - } +template +T cast_to(uint64_t val) { + return static_cast(val); +} - const auto vec_u8 = create_vec(cast_to); - const auto vec_u16 = create_vec(cast_to); - const auto vec_u32 = create_vec(cast_to); - const auto vec_u64 = create_vec(cast_to); - const auto vec_float = create_vec(cast_to); - const auto vec_double = create_vec(cast_to); +const auto vec_u8 = create_vec(cast_to); +const auto vec_u16 = create_vec(cast_to); +const auto vec_u32 = create_vec(cast_to); +const auto vec_u64 = create_vec(cast_to); +const auto vec_float = create_vec(cast_to); +const auto vec_double = create_vec(cast_to); - const auto vec_str = create_vec([](uint64_t val) { return to_string(static_cast(val)); }); - const auto vec_wstr = create_vec([](uint64_t val) { return to_wstring(static_cast(val)); }); +const auto vec_str = create_vec([](uint64_t val) { return to_string(static_cast(val)); }); +const auto vec_wstr = create_vec([](uint64_t val) { return to_wstring(static_cast(val)); }); - template - void BM_push_range(benchmark::State& state) { - const size_t frag_size = static_cast(state.range(0)); +template +void BM_push_range(benchmark::State& state) { + const size_t frag_size = static_cast(state.range(0)); - for (auto _ : state) { - priority_queue que; - span spn{Data}; + for (auto _ : state) { + priority_queue que; + span spn{Data}; - while (!spn.empty()) { - const size_t take_size = min(spn.size(), frag_size); - que.push_range(spn.first(take_size)); - spn = spn.subspan(take_size); - } - benchmark::DoNotOptimize(que); + while (!spn.empty()) { + const size_t take_size = min(spn.size(), frag_size); + que.push_range(spn.first(take_size)); + spn = spn.subspan(take_size); } + benchmark::DoNotOptimize(que); } +} - template - void putln(const benchmark::State&) { - static bool b = [] { - puts(""); - return true; - }(); - } -} // namespace +template +void putln(const benchmark::State&) { + static bool b = [] { + puts(""); + return true; + }(); +} #define TEST_PUSH_RANGE(T, source) \ BENCHMARK(BM_push_range) \ diff --git a/benchmarks/src/std_copy.cpp b/benchmarks/src/std_copy.cpp index 5aa07e56b40..40c2cb7c148 100644 --- a/benchmarks/src/std_copy.cpp +++ b/benchmarks/src/std_copy.cpp @@ -11,80 +11,77 @@ #include #include -namespace { - template - void handwritten_loop(benchmark::State& state) { - const size_t r0 = static_cast(state.range(0)); - const auto in_buffer = random_vector(r0); - std::vector out_buffer(r0); - for ([[maybe_unused]] auto _ : state) { - benchmark::DoNotOptimize(in_buffer.data()); - const Contained* in_ptr = in_buffer.data(); - const Contained* const in_ptr_end = in_ptr + r0; - Contained* out_ptr = out_buffer.data(); - while (in_ptr != in_ptr_end) { - *out_ptr++ = *in_ptr++; - } - - benchmark::DoNotOptimize(out_buffer.data()); +template +void handwritten_loop(benchmark::State& state) { + const size_t r0 = static_cast(state.range(0)); + const auto in_buffer = random_vector(r0); + std::vector out_buffer(r0); + for ([[maybe_unused]] auto _ : state) { + benchmark::DoNotOptimize(in_buffer.data()); + const Contained* in_ptr = in_buffer.data(); + const Contained* const in_ptr_end = in_ptr + r0; + Contained* out_ptr = out_buffer.data(); + while (in_ptr != in_ptr_end) { + *out_ptr++ = *in_ptr++; } - } - template - void handwritten_loop_n(benchmark::State& state) { - const size_t r0 = static_cast(state.range(0)); - const auto in_buffer = random_vector(r0); - std::vector out_buffer(r0); - for ([[maybe_unused]] auto _ : state) { - benchmark::DoNotOptimize(in_buffer.data()); - const Contained* const in_ptr = in_buffer.data(); - Contained* const out_ptr = out_buffer.data(); - for (size_t idx = 0; idx < r0; ++idx) { - out_ptr[idx] = in_ptr[idx]; - } - - benchmark::DoNotOptimize(out_buffer.data()); - } + benchmark::DoNotOptimize(out_buffer.data()); } - - template - void memcpy_call(benchmark::State& state) { - static_assert( - std::is_trivially_copyable_v, "memcpy must only be called on trivially copyable types"); - const size_t r0 = static_cast(state.range(0)); - const auto in_buffer = random_vector(r0); - std::vector out_buffer(r0); - for ([[maybe_unused]] auto _ : state) { - benchmark::DoNotOptimize(in_buffer.data()); - memcpy(out_buffer.data(), in_buffer.data(), r0 * sizeof(Contained)); - benchmark::DoNotOptimize(out_buffer.data()); +} + +template +void handwritten_loop_n(benchmark::State& state) { + const size_t r0 = static_cast(state.range(0)); + const auto in_buffer = random_vector(r0); + std::vector out_buffer(r0); + for ([[maybe_unused]] auto _ : state) { + benchmark::DoNotOptimize(in_buffer.data()); + const Contained* const in_ptr = in_buffer.data(); + Contained* const out_ptr = out_buffer.data(); + for (size_t idx = 0; idx < r0; ++idx) { + out_ptr[idx] = in_ptr[idx]; } - } - template - void std_copy_call(benchmark::State& state) { - const size_t r0 = static_cast(state.range(0)); - const auto in_buffer = random_vector(r0); - std::vector out_buffer(r0); - for ([[maybe_unused]] auto _ : state) { - benchmark::DoNotOptimize(in_buffer.data()); - std::copy(in_buffer.begin(), in_buffer.end(), out_buffer.begin()); - benchmark::DoNotOptimize(out_buffer.data()); - } + benchmark::DoNotOptimize(out_buffer.data()); } - - template - void std_copy_n_call(benchmark::State& state) { - const size_t r0 = static_cast(state.range(0)); - const auto in_buffer = random_vector(r0); - std::vector out_buffer(r0); - for ([[maybe_unused]] auto _ : state) { - benchmark::DoNotOptimize(in_buffer.data()); - std::copy_n(in_buffer.begin(), r0, out_buffer.begin()); - benchmark::DoNotOptimize(out_buffer.data()); - } +} + +template +void memcpy_call(benchmark::State& state) { + static_assert(std::is_trivially_copyable_v, "memcpy must only be called on trivially copyable types"); + const size_t r0 = static_cast(state.range(0)); + const auto in_buffer = random_vector(r0); + std::vector out_buffer(r0); + for ([[maybe_unused]] auto _ : state) { + benchmark::DoNotOptimize(in_buffer.data()); + memcpy(out_buffer.data(), in_buffer.data(), r0 * sizeof(Contained)); + benchmark::DoNotOptimize(out_buffer.data()); + } +} + +template +void std_copy_call(benchmark::State& state) { + const size_t r0 = static_cast(state.range(0)); + const auto in_buffer = random_vector(r0); + std::vector out_buffer(r0); + for ([[maybe_unused]] auto _ : state) { + benchmark::DoNotOptimize(in_buffer.data()); + std::copy(in_buffer.begin(), in_buffer.end(), out_buffer.begin()); + benchmark::DoNotOptimize(out_buffer.data()); + } +} + +template +void std_copy_n_call(benchmark::State& state) { + const size_t r0 = static_cast(state.range(0)); + const auto in_buffer = random_vector(r0); + std::vector out_buffer(r0); + for ([[maybe_unused]] auto _ : state) { + benchmark::DoNotOptimize(in_buffer.data()); + std::copy_n(in_buffer.begin(), r0, out_buffer.begin()); + benchmark::DoNotOptimize(out_buffer.data()); } -} // namespace +} BENCHMARK(handwritten_loop)->Range(0, 1 << 18); BENCHMARK(handwritten_loop_n)->Range(0, 1 << 18); From d6310189152b9213876c4ac106642710825dd780 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 27 Mar 2025 15:52:06 -0700 Subject: [PATCH 10/12] Build the STL and benchmarks with /nologo. By default, this makes no difference. But when investigating what the build system is doing with `-DCMAKE_VERBOSE_MAKEFILE=ON`, this suppresses the verbose: Microsoft (R) C/C++ Optimizing Compiler Version 19.44.34918.1 for x64 Copyright (C) Microsoft Corporation. All rights reserved. and extremely verbose: /std:c++latest is provided as a preview of language features from the latest C++ working draft, and we're eager to hear about bugs and suggestions for improvements. However, note that these features are provided as-is without support, and subject to changes or removal as the working draft evolves. See https://go.microsoft.com/fwlink/?linkid=2045807 for details. --- benchmarks/CMakeLists.txt | 2 +- stl/CMakeLists.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index b2993108b72..9469430d2b3 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -49,7 +49,7 @@ set(CMAKE_MSVC_RUNTIME_LIBRARY "${STL_BENCHMARK_MSVC_RUNTIME_LIBRARY}") set(CMAKE_BUILD_TYPE RelWithDebInfo) # /utf-8 affects . -add_compile_options("$<$:/diagnostics:caret;/W4;/WX;/w14265;/w15038;/w15262;/utf-8;/Zc:preprocessor>") +add_compile_options("$<$:/nologo;/diagnostics:caret;/W4;/WX;/w14265;/w15038;/w15262;/utf-8;/Zc:preprocessor>") if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/google-benchmark/.git") message(FATAL_ERROR "google-benchmark is not checked out; make sure to run\n git submodule update --init benchmarks/google-benchmark") diff --git a/stl/CMakeLists.txt b/stl/CMakeLists.txt index 1cac7b202b3..968d98987ec 100644 --- a/stl/CMakeLists.txt +++ b/stl/CMakeLists.txt @@ -423,9 +423,9 @@ add_compile_definitions(_CRTBLD _VCRT_ALLOW_INTERNALS _HAS_OLD_IOSTREAMS_MEMBERS # /Z7 for MSVC, /Zi for MASM set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "Embedded") -add_compile_options(/WX /Gy +add_compile_options(/nologo /WX /Gy "$<$:/diagnostics:caret;/W4;/w14265;/w15038;/fastfail;/guard:cf;/Zp8;/std:c++latest;/permissive-;/Zc:preprocessor;/Zc:threadSafeInit-;/Zl>" - "$<$:/W3;/nologo;/quiet>" + "$<$:/W3;/quiet>" ) include_directories(BEFORE From a97b8cff995e64c08a409bb4738ee16b16d4ec7f Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 27 Mar 2025 16:19:48 -0700 Subject: [PATCH 11/12] Fix GH 4496 and remove workaround. --- benchmarks/CMakeLists.txt | 6 ++++-- stl/inc/xutility | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index 9469430d2b3..d3799838d2f 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -46,10 +46,12 @@ set_property(CACHE STL_BENCHMARK_MSVC_RUNTIME_LIBRARY ) set(CMAKE_MSVC_RUNTIME_LIBRARY "${STL_BENCHMARK_MSVC_RUNTIME_LIBRARY}") -set(CMAKE_BUILD_TYPE RelWithDebInfo) +# Building the benchmarks as Release optimizes them with `/O2 /Ob2`; adding `/Zi` below makes profiling possible. +# (RelWithDebInfo would use `/O2 /Ob1 /Zi`.) See GH-4496. +set(CMAKE_BUILD_TYPE Release) # /utf-8 affects . -add_compile_options("$<$:/nologo;/diagnostics:caret;/W4;/WX;/w14265;/w15038;/w15262;/utf-8;/Zc:preprocessor>") +add_compile_options("$<$:/Zi;/nologo;/diagnostics:caret;/W4;/WX;/w14265;/w15038;/w15262;/utf-8;/Zc:preprocessor>") if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/google-benchmark/.git") message(FATAL_ERROR "google-benchmark is not checked out; make sure to run\n git submodule update --init benchmarks/google-benchmark") diff --git a/stl/inc/xutility b/stl/inc/xutility index fbce0c9df7c..50b79336cce 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -417,8 +417,7 @@ auto _Max_vectorized(_Ty* const _First, _Ty* const _Last) noexcept { } template -inline size_t // TRANSITION, GH-4496 - _Mismatch_vectorized(const void* const _First1, const void* const _First2, const size_t _Count) noexcept { +size_t _Mismatch_vectorized(const void* const _First1, const void* const _First2, const size_t _Count) noexcept { if constexpr (_Element_size == 1) { return __std_mismatch_1(_First1, _First2, _Count); } else if constexpr (_Element_size == 2) { From a4e784044f615d8ec5dc51980a8f317ebb87c0ae Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 28 Mar 2025 00:43:47 -0700 Subject: [PATCH 12/12] Link with /DEBUG to generate PDBs. --- benchmarks/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index d3799838d2f..92f10d10ab0 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -46,13 +46,16 @@ set_property(CACHE STL_BENCHMARK_MSVC_RUNTIME_LIBRARY ) set(CMAKE_MSVC_RUNTIME_LIBRARY "${STL_BENCHMARK_MSVC_RUNTIME_LIBRARY}") -# Building the benchmarks as Release optimizes them with `/O2 /Ob2`; adding `/Zi` below makes profiling possible. +# Building the benchmarks as Release optimizes them with `/O2 /Ob2`. +# Compiling with `/Zi` and linking with `/DEBUG` below makes profiling possible. # (RelWithDebInfo would use `/O2 /Ob1 /Zi`.) See GH-4496. set(CMAKE_BUILD_TYPE Release) # /utf-8 affects . add_compile_options("$<$:/Zi;/nologo;/diagnostics:caret;/W4;/WX;/w14265;/w15038;/w15262;/utf-8;/Zc:preprocessor>") +add_link_options("/DEBUG") + if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/google-benchmark/.git") message(FATAL_ERROR "google-benchmark is not checked out; make sure to run\n git submodule update --init benchmarks/google-benchmark") endif()