File: histogram_bench.cc

package info (click to toggle)
prometheus-cpp 1.0.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 792 kB
  • sloc: cpp: 3,596; sh: 37; makefile: 12
file content (70 lines) | stat: -rw-r--r-- 2,276 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <benchmark/benchmark.h>

#include <chrono>
#include <cstdint>
#include <random>
#include <vector>

#include "prometheus/family.h"
#include "prometheus/histogram.h"
#include "prometheus/registry.h"

using prometheus::Histogram;

static Histogram::BucketBoundaries CreateLinearBuckets(std::int64_t start,
                                                       std::int64_t end,
                                                       std::int64_t step) {
  auto bucket_boundaries = Histogram::BucketBoundaries{};
  for (auto i = start; i < end; i += step) {
    bucket_boundaries.push_back(i);
  }
  return bucket_boundaries;
}

static void BM_Histogram_Observe(benchmark::State& state) {
  using prometheus::BuildHistogram;
  using prometheus::Histogram;
  using prometheus::Registry;

  const auto number_of_buckets = state.range(0);

  Registry registry;
  auto& histogram_family =
      BuildHistogram().Name("benchmark_histogram").Help("").Register(registry);
  auto bucket_boundaries = CreateLinearBuckets(0, number_of_buckets - 1, 1);
  auto& histogram = histogram_family.Add({}, bucket_boundaries);
  std::random_device rd;
  std::mt19937 gen(rd());
  std::uniform_real_distribution<> d(0, number_of_buckets);

  while (state.KeepRunning()) {
    auto observation = d(gen);
    auto start = std::chrono::high_resolution_clock::now();
    histogram.Observe(observation);
    auto end = std::chrono::high_resolution_clock::now();

    auto elapsed_seconds =
        std::chrono::duration_cast<std::chrono::duration<double>>(end - start);
    state.SetIterationTime(elapsed_seconds.count());
  }
}
BENCHMARK(BM_Histogram_Observe)->Range(0, 4096);

static void BM_Histogram_Collect(benchmark::State& state) {
  using prometheus::BuildHistogram;
  using prometheus::Histogram;
  using prometheus::Registry;

  const auto number_of_buckets = state.range(0);

  Registry registry;
  auto& histogram_family =
      BuildHistogram().Name("benchmark_histogram").Help("").Register(registry);
  auto bucket_boundaries = CreateLinearBuckets(0, number_of_buckets - 1, 1);
  auto& histogram = histogram_family.Add({}, bucket_boundaries);

  while (state.KeepRunning()) {
    benchmark::DoNotOptimize(histogram.Collect());
  }
}
BENCHMARK(BM_Histogram_Collect)->Range(0, 4096);