Guest User

Untitled

a guest
Dec 3rd, 2025
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.02 KB | None | 0 0
  1. #include <benchmark/benchmark.h>
  2. #include <random>
  3. #include <stdint.h>
  4.  
  5. #include <roaring/roaring.hh>
  6.  
  7. constexpr size_t BENCHMARK_NUM_ROWS = 8192;
  8. constexpr size_t BENCHMARK_NUM_ITERATIONS = 100;
  9.  
  10. using namespace roaring;
  11.  
  12. static Roaring createBitmapWithFilterRate(double filter_rate,
  13.                                           uint32_t starting_row,
  14.                                           size_t num_rows,
  15.                                           size_t num_iterations,
  16.                                           unsigned seed) {
  17.     std::mt19937_64 rng(seed);
  18.     std::uniform_real_distribution<double> dist(0.0, 1.0);
  19.  
  20.     Roaring bitmap;
  21.  
  22.     std::vector<uint32_t> values;
  23.     values.reserve(static_cast<size_t>(num_rows * num_iterations * filter_rate *
  24.                                        1.2));  // Reserve slightly more
  25.  
  26.     /// Generate values based on filter rate for multiple iterations
  27.     for (size_t iter = 0; iter < num_iterations; ++iter) {
  28.         uint32_t iter_offset = static_cast<uint32_t>(iter * num_rows);
  29.         for (size_t i = 0; i < num_rows; ++i) {
  30.             if (dist(rng) < filter_rate) {
  31.                 values.push_back(
  32.                     static_cast<uint32_t>(starting_row + iter_offset + i));
  33.             }
  34.         }
  35.     }
  36.  
  37.     if (!values.empty()) bitmap.addMany(values.size(), values.data());
  38.     return bitmap;
  39. }
  40.  
  41. void fillBoolArrayByIterator(const api::roaring_bitmap_t* bitmap, bool* array,
  42.                              uint32_t starting_row, size_t ending_row) {
  43.     api::roaring_uint32_iterator_t it;
  44.     roaring_iterator_init(bitmap, &it);
  45.     if (!roaring_uint32_iterator_move_equalorlarger(&it, starting_row)) return;
  46.     while (it.current_value < ending_row) {
  47.         array[it.current_value - starting_row] = true;
  48.         if (!roaring_uint32_iterator_advance(&it)) break;
  49.     }
  50. }
  51.  
  52. // Helper macro to generate benchmark functions
  53. // Each pair of benchmarks shares the same bitmap instance
  54. #define BENCHMARK_FILTER_RATE(name, rate_value, label)                      \
  55.     static Roaring g_bitmap_##name = createBitmapWithFilterRate(            \
  56.         rate_value, 0, BENCHMARK_NUM_ROWS, BENCHMARK_NUM_ITERATIONS, 42);   \
  57.                                                                             \
  58.     static void BM_ToBoolArray_FilterRate_##name(benchmark::State& state) { \
  59.         const size_t total_rows =                                           \
  60.             BENCHMARK_NUM_ITERATIONS * BENCHMARK_NUM_ROWS;                  \
  61.                                                                             \
  62.         bool* array = new bool[total_rows];                                 \
  63.         for (auto _ : state) {                                              \
  64.             for (size_t i = 0; i < BENCHMARK_NUM_ITERATIONS; ++i) {         \
  65.                 uint32_t iter_start =                                       \
  66.                     static_cast<uint32_t>(i * BENCHMARK_NUM_ROWS);          \
  67.                 api::roaring_bitmap_range_bool_array(                       \
  68.                     &g_bitmap_##name.roaring, iter_start,                   \
  69.                     iter_start + BENCHMARK_NUM_ROWS, array);                \
  70.                 benchmark::DoNotOptimize(array);                            \
  71.             }                                                               \
  72.             benchmark::DoNotOptimize(array);                                \
  73.         }                                                                   \
  74.         state.SetItemsProcessed(state.iterations() * total_rows);           \
  75.         state.SetLabel("filter_rate=" label ",iterations=100");             \
  76.         delete[] array;                                                     \
  77.     }                                                                       \
  78.                                                                             \
  79.     static void BM_ToBoolArrayByIterator_FilterRate_##name(                 \
  80.         benchmark::State& state) {                                          \
  81.         const size_t total_rows =                                           \
  82.             BENCHMARK_NUM_ITERATIONS * BENCHMARK_NUM_ROWS;                  \
  83.                                                                             \
  84.         bool* array = new bool[total_rows];                                 \
  85.         for (auto _ : state) {                                              \
  86.             for (size_t i = 0; i < BENCHMARK_NUM_ITERATIONS; ++i) {         \
  87.                 uint32_t iter_start =                                       \
  88.                     static_cast<uint32_t>(i * BENCHMARK_NUM_ROWS);          \
  89.                 fillBoolArrayByIterator(&g_bitmap_##name.roaring, array,    \
  90.                                         iter_start,                         \
  91.                                         iter_start + BENCHMARK_NUM_ROWS);   \
  92.                 benchmark::DoNotOptimize(array);                            \
  93.             }                                                               \
  94.             benchmark::DoNotOptimize(array);                                \
  95.         }                                                                   \
  96.         state.SetItemsProcessed(state.iterations() * total_rows);           \
  97.         state.SetLabel("filter_rate=" label ",iterations=100");             \
  98.         delete[] array;                                                     \
  99.     }                                                                       \
  100.                                                                             \
  101.     BENCHMARK(BM_ToBoolArray_FilterRate_##name);                            \
  102.     BENCHMARK(BM_ToBoolArrayByIterator_FilterRate_##name)
  103.  
  104. // Generate benchmarks for different filter rates
  105. BENCHMARK_FILTER_RATE(0_1, 0.001, "0.1%");
  106. BENCHMARK_FILTER_RATE(1, 0.01, "1%");
  107. BENCHMARK_FILTER_RATE(10, 0.10, "10%");
  108. BENCHMARK_FILTER_RATE(50, 0.50, "50%");
  109. BENCHMARK_FILTER_RATE(90, 0.90, "90%");
  110. BENCHMARK_FILTER_RATE(99, 0.99, "99%");
  111. BENCHMARK_MAIN();
Advertisement
Add Comment
Please, Sign In to add comment