From f83e21b5a0575ea5c5f77ebf898b3b4ced6c021f Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Thu, 11 Sep 2025 13:13:05 -0400 Subject: [PATCH] Defeat shared_ptr's single-threaded optimizations WeaselDB is always going to start multiple threads, so we don't care about single-threaded performance --- benchmarks/bench_reference.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/benchmarks/bench_reference.cpp b/benchmarks/bench_reference.cpp index 649bcbb..b2fe9fe 100644 --- a/benchmarks/bench_reference.cpp +++ b/benchmarks/bench_reference.cpp @@ -43,9 +43,16 @@ template struct PointerTraits> { static const char *weak_name() { return "WeakRef"; } }; +// Force multi-threaded mode to defeat __libc_single_threaded optimization +void force_multithreaded() { + std::thread t([]() {}); + t.join(); +} + template void benchmark_creation(ankerl::nanobench::Bench &bench) { using Traits = PointerTraits; + force_multithreaded(); bench.run(std::string(Traits::name()) + " creation", [&] { auto ptr = Traits::make(TestObject{123}); @@ -56,6 +63,7 @@ void benchmark_creation(ankerl::nanobench::Bench &bench) { template void benchmark_copy(ankerl::nanobench::Bench &bench) { using Traits = PointerTraits; + force_multithreaded(); auto original = Traits::make(TestObject{123}); bench.run(std::string(Traits::name()) + " copy", [&] { @@ -80,6 +88,7 @@ void benchmark_move(ankerl::nanobench::Bench &bench) { template void benchmark_weak_copy(ankerl::nanobench::Bench &bench) { using Traits = PointerTraits; + force_multithreaded(); auto strong_ptr = Traits::make(TestObject{123}); typename Traits::weak_type weak_original = strong_ptr;