From aaee5c0f0dc9645aec77830d6764dc580a244d91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Fri, 29 May 2026 15:34:49 +0200 Subject: [PATCH] Add erase ratio geomean --- experimental/bench_hub.cpp | 63 ++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/experimental/bench_hub.cpp b/experimental/bench_hub.cpp index 6caf920..140d51f 100644 --- a/experimental/bench_hub.cpp +++ b/experimental/bench_hub.cpp @@ -22,23 +22,30 @@ int main() { return 0; } #include "../bench/bench_utils.hpp" #ifndef ELEMENT_SIZE -#define ELEMENT_SIZE 64 -//#define ELEMENT_SIZE 16 +#define ELEMENT_SIZE 16 +//#define ELEMENT_SIZE 32 +//#define ELEMENT_SIZE 64 +//#define ELEMENT_SIZE 80 #endif #define NONTRIVIAL_ELEMENT std::chrono::high_resolution_clock::time_point measure_start, measure_pause; template -double measure(F f) +BOOST_NOINLINE double measure(F f) { using namespace std::chrono; //static const int num_trials = 10; //static const milliseconds min_time_per_trial(200); - static const std::size_t num_trials = 5; - static const milliseconds min_time_per_trial(100); + #ifdef NDEBUG + static const std::size_t num_trials = 8; + static const milliseconds min_time_per_trial(75); + #else + static const std::size_t num_trials = 1; + static const milliseconds min_time_per_trial(0); + #endif std::array trials; @@ -60,7 +67,9 @@ double measure(F f) } std::sort(trials.begin(), trials.end()); - return std::accumulate(trials.begin() + 2, trials.end() - 2, 0.0)/(trials.size() - 4); + const std::size_t ts = trials.size(); + const std::size_t ts_discard = ts/4; + return std::accumulate(trials.begin() + ts_discard, trials.end(), 0.0)/(ts - ts_discard); } BOOST_CONTAINER_FORCEINLINE void pause_timing() @@ -198,7 +207,8 @@ static double min_erasure_rate = 0.0, */ static std::size_t min_size_exp = 3, - max_size_exp = 5; + max_size_exp = 7 +; static double min_erasure_rate = 0.1, max_erasure_rate = 0.9, erase_rate_inc = 0.4; @@ -210,6 +220,8 @@ struct benchmark_result std::vector> ratios; }; +double geomean(const benchmark_result& bench); // defined further below + template benchmark_result benchmark(const char* title, FNum fnum, FDen fden) { @@ -233,7 +245,7 @@ benchmark_result benchmark(const char* title, FNum fnum, FDen fden) { std::cout << "1.E" << i << " "; } - std::cout << std::endl; + std::cout << " mean" << std::endl; for(double erasure_rate = min_erasure_rate; erasure_rate <= max_erasure_rate; @@ -259,8 +271,20 @@ benchmark_result benchmark(const char* title, FNum fnum, FDen fden) std::cout << out.str() << " " << std::flush; res.data.back().push_back(out.str()); } + { //Per-row geomean across the container sizes for this erase rate. + double row_log_sum = 0.0; + std::size_t row_count = 0; + for(double r: res.ratios.back()) { + if(r > 0.0) { row_log_sum += std::log(r); ++row_count; } + } + double row_geomean = row_count ? std::exp(row_log_sum / (double)row_count) : 0.0; + std::cout << std::fixed << std::setprecision(2) << row_geomean; + } std::cout << std::endl; } + std::cout << std::left << std::setw(11) << "geomean" + << std::right << std::fixed << std::setprecision(3) + << geomean(res) << "\n"; return res; } @@ -315,7 +339,7 @@ struct prepare }; template -struct for_each: prepare +struct iteration: prepare { unsigned int operator()(std::size_t n, double erasure_rate) { @@ -327,7 +351,7 @@ struct for_each: prepare }; template -struct visit_all: prepare +struct for_each: prepare { unsigned int operator()(std::size_t n, double erasure_rate) { @@ -341,8 +365,8 @@ struct visit_all: prepare #if defined(PLF_HIVE_BENCH) template -struct visit_all > - : for_each< plf::hive > +struct for_each > + : iteration< plf::hive > {}; #endif @@ -469,28 +493,33 @@ int main(int argc,char* argv[]) using num = plf::hive; #else using num = hub; + //using num = nest; //using num = nest > >; //using num = nest > >; //using num = nest, store_data_in_block > >; #endif using den = nest; + //using den = nest > >; + //using den = nest > >; + //using den = nest > >; + //using den = nest, block_cacheline_align > >; table t; + t.push_back(benchmark( + "iteration", + ::iteration{}, ::iteration{})); t.push_back(benchmark( "for_each", ::for_each{}, ::for_each{})); t.push_back(benchmark( - "visit_all", - visit_all{}, visit_all{})); + "sort", + sort{}, sort{})); t.push_back(benchmark( "creat, ins, erase, ins", create{}, create{})); t.push_back(benchmark( "creat, ins, erase, ins, destroy", create_and_destroy{}, create_and_destroy{})); - t.push_back(benchmark( - "sort", - sort{}, sort{})); const char* filename = "hub_test.txt"; write_table(t, filename);