From 6665998c2f7760facf277b969526bb831b736a7f Mon Sep 17 00:00:00 2001 From: Bowen Han Date: Sat, 7 Jun 2025 05:19:55 +0200 Subject: [PATCH 1/2] Add STL comparison benchmarks for set_bit --- bitvector_benchmark.cpp | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/bitvector_benchmark.cpp b/bitvector_benchmark.cpp index 3b593d5..fc4f3aa 100644 --- a/bitvector_benchmark.cpp +++ b/bitvector_benchmark.cpp @@ -72,6 +72,50 @@ static void BM_Std_Access(benchmark::State& state) { } } +static void BM_Bowen_SetBit(benchmark::State& state) { + size_t n = state.range(0); + for (auto _ : state) { + bitvector<> bv(n); + for (size_t i=0;i(i & 1)); + } + benchmark::ClobberMemory(); + } +} + +static void BM_Std_SetBit(benchmark::State& state) { + size_t n = state.range(0); + for (auto _ : state) { + std::vector bv(n); + for (size_t i=0;i(i & 1); + } + benchmark::ClobberMemory(); + } +} + +static void BM_Bowen_SetBitTrueUnsafe(benchmark::State& state) { + size_t n = state.range(0); + for (auto _ : state) { + bitvector<> bv(n); + for (size_t i=0;i bv(n); + for (size_t i=0;iArg(1<<20)->MinTime(5.0); BENCHMARK(BM_Std_PushBack)->Arg(1<<20)->MinTime(5.0); BENCHMARK(BM_Bowen_Access)->Arg(1<<20)->MinTime(5.0); BENCHMARK(BM_Std_Access)->Arg(1<<20)->MinTime(5.0); +BENCHMARK(BM_Bowen_SetBit)->Arg(1<<20)->MinTime(5.0); +BENCHMARK(BM_Std_SetBit)->Arg(1<<20)->MinTime(5.0); +BENCHMARK(BM_Bowen_SetBitTrueUnsafe)->Arg(1<<20)->MinTime(5.0); +BENCHMARK(BM_Std_SetBitTrueUnsafe)->Arg(1<<20)->MinTime(5.0); BENCHMARK(BM_Bowen_SetBitTrue6)->Arg(1<<20)->MinTime(5.0); BENCHMARK(BM_Std_SetBitTrue6)->Arg(1<<20)->MinTime(5.0); BENCHMARK(BM_Bowen_QSetBitTrue6V2)->Arg(1<<20)->MinTime(5.0); From ae1276b5c6bf1131e3a3f3fb49a8570c1ded1bfa Mon Sep 17 00:00:00 2001 From: Bowen Han Date: Sat, 7 Jun 2025 05:27:49 +0200 Subject: [PATCH 2/2] Restore benchmark config macros --- CMakeLists.txt | 11 ++++++++++- bitvector_benchmark.cpp | 36 ++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 92fa85e..1b3b072 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,14 @@ cmake_minimum_required(VERSION 3.21) project(bitvector) set(CMAKE_CXX_STANDARD 17) + +# Allow configuring how long tests may run and how long benchmarks +# should execute. The timeout for GoogleTest-based unit tests is set via +# `BITVECTOR_TEST_TIMEOUT`. The minimum runtime for Google Benchmark +# benchmarks is configured with `BITVECTOR_BENCHMARK_MIN_TIME`. +set(BITVECTOR_TEST_TIMEOUT 10 CACHE STRING "Timeout in seconds for each unit test") +set(BITVECTOR_BENCHMARK_MIN_TIME 0.2 CACHE STRING "Minimum time in seconds for benchmark runs") + option(BITVECTOR_NO_BOUND_CHECK "Disable bounds checking in bitvector" ON) if(BITVECTOR_NO_BOUND_CHECK) add_compile_definitions(BITVECTOR_NO_BOUND_CHECK) @@ -78,6 +86,7 @@ target_link_libraries(bitvector_tests GTest::gtest_main) # Benchmark target add_executable(bitvector_benchmark bitvector_benchmark.cpp) target_link_libraries(bitvector_benchmark benchmark::benchmark) +target_compile_definitions(bitvector_benchmark PRIVATE BITVECTOR_BENCHMARK_MIN_TIME=${BITVECTOR_BENCHMARK_MIN_TIME}) # Link your project with Google Test (only for test purposes) @@ -91,5 +100,5 @@ target_link_libraries(bitvector_benchmark benchmark::benchmark) # Enable test discovery include(GoogleTest) -gtest_discover_tests(bitvector_tests) +gtest_discover_tests(bitvector_tests PROPERTIES TIMEOUT ${BITVECTOR_TEST_TIMEOUT}) diff --git a/bitvector_benchmark.cpp b/bitvector_benchmark.cpp index fc4f3aa..9515f24 100644 --- a/bitvector_benchmark.cpp +++ b/bitvector_benchmark.cpp @@ -2,6 +2,10 @@ #include #include +#ifndef BITVECTOR_BENCHMARK_MIN_TIME +#define BITVECTOR_BENCHMARK_MIN_TIME 0.2 +#endif + using bowen::bitvector; static void BM_Bowen_Set(benchmark::State& state) { @@ -187,21 +191,21 @@ static void BM_Std_IncrementUntilZero(benchmark::State& state) { } } -BENCHMARK(BM_Bowen_Set)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Std_Set)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Bowen_PushBack)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Std_PushBack)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Bowen_Access)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Std_Access)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Bowen_SetBit)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Std_SetBit)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Bowen_SetBitTrueUnsafe)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Std_SetBitTrueUnsafe)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Bowen_SetBitTrue6)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Std_SetBitTrue6)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Bowen_QSetBitTrue6V2)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Std_QSetBitTrue6)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Bowen_IncrementUntilZero)->Arg(1<<20)->MinTime(5.0); -BENCHMARK(BM_Std_IncrementUntilZero)->Arg(1<<20)->MinTime(5.0); +BENCHMARK(BM_Bowen_Set)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Std_Set)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Bowen_PushBack)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Std_PushBack)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Bowen_Access)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Std_Access)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Bowen_SetBit)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Std_SetBit)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Bowen_SetBitTrueUnsafe)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Std_SetBitTrueUnsafe)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Bowen_SetBitTrue6)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Std_SetBitTrue6)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Bowen_QSetBitTrue6V2)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Std_QSetBitTrue6)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Bowen_IncrementUntilZero)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); +BENCHMARK(BM_Std_IncrementUntilZero)->Arg(1<<20)->MinTime(BITVECTOR_BENCHMARK_MIN_TIME); BENCHMARK_MAIN();