Skip to content

Commit 8ec7845

Browse files
committed
[hist] Add microbenchmarks for RHistStats::Fill
1 parent 35d4887 commit 8ec7845

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed

hist/histv7/benchmark/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,6 @@ target_link_libraries(hist_benchmark_engine ROOTHist benchmark::benchmark)
66

77
add_executable(hist_benchmark_regular hist_benchmark_regular.cxx)
88
target_link_libraries(hist_benchmark_regular ROOTHist benchmark::benchmark)
9+
10+
add_executable(hist_benchmark_stats hist_benchmark_stats.cxx)
11+
target_link_libraries(hist_benchmark_stats ROOTHist benchmark::benchmark)
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#include <ROOT/RHistStats.hxx>
2+
#include <ROOT/RWeight.hxx>
3+
4+
#include <benchmark/benchmark.h>
5+
6+
#include <random>
7+
#include <vector>
8+
9+
struct RHistStats1 : public benchmark::Fixture {
10+
// The object is stored and constructed in the fixture to avoid compiler optimizations in the benchmark body taking
11+
// advantage of the (constant) constructor parameters.
12+
ROOT::Experimental::RHistStats stats{1};
13+
std::vector<double> fNumbers;
14+
15+
// Avoid GCC warning
16+
using benchmark::Fixture::SetUp;
17+
void SetUp(benchmark::State &state) final
18+
{
19+
std::mt19937 gen;
20+
std::uniform_real_distribution<> dis;
21+
fNumbers.resize(state.range(0));
22+
for (std::size_t i = 0; i < fNumbers.size(); i++) {
23+
fNumbers[i] = dis(gen);
24+
}
25+
}
26+
};
27+
28+
BENCHMARK_DEFINE_F(RHistStats1, Fill)(benchmark::State &state)
29+
{
30+
for (auto _ : state) {
31+
for (double number : fNumbers) {
32+
stats.Fill(number);
33+
}
34+
}
35+
}
36+
BENCHMARK_REGISTER_F(RHistStats1, Fill)->Range(0, 32768);
37+
38+
BENCHMARK_DEFINE_F(RHistStats1, FillWeight)(benchmark::State &state)
39+
{
40+
for (auto _ : state) {
41+
for (double number : fNumbers) {
42+
stats.Fill(number, ROOT::Experimental::RWeight(0.8));
43+
}
44+
}
45+
}
46+
BENCHMARK_REGISTER_F(RHistStats1, FillWeight)->Range(0, 32768);
47+
48+
struct RHistStats2 : public benchmark::Fixture {
49+
// The object is stored and constructed in the fixture to avoid compiler optimizations in the benchmark body taking
50+
// advantage of the (constant) constructor parameters.
51+
ROOT::Experimental::RHistStats stats{2};
52+
std::vector<double> fNumbers;
53+
54+
// Avoid GCC warning
55+
using benchmark::Fixture::SetUp;
56+
void SetUp(benchmark::State &state) final
57+
{
58+
std::mt19937 gen;
59+
std::uniform_real_distribution<> dis;
60+
fNumbers.resize(2 * state.range(0));
61+
for (std::size_t i = 0; i < fNumbers.size(); i++) {
62+
fNumbers[i] = dis(gen);
63+
}
64+
}
65+
};
66+
67+
BENCHMARK_DEFINE_F(RHistStats2, Fill)(benchmark::State &state)
68+
{
69+
for (auto _ : state) {
70+
for (std::size_t i = 0; i < fNumbers.size(); i += 2) {
71+
stats.Fill(fNumbers[i], fNumbers[i + 1]);
72+
}
73+
}
74+
}
75+
BENCHMARK_REGISTER_F(RHistStats2, Fill)->Range(0, 32768);
76+
77+
BENCHMARK_DEFINE_F(RHistStats2, FillWeight)(benchmark::State &state)
78+
{
79+
for (auto _ : state) {
80+
for (std::size_t i = 0; i < fNumbers.size(); i += 2) {
81+
stats.Fill(fNumbers[i], fNumbers[i + 1], ROOT::Experimental::RWeight(0.8));
82+
}
83+
}
84+
}
85+
BENCHMARK_REGISTER_F(RHistStats2, FillWeight)->Range(0, 32768);
86+
87+
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)