1*dbb99499SAndroid Build Coastguard Worker #include <cassert>
2*dbb99499SAndroid Build Coastguard Worker #include <iostream>
3*dbb99499SAndroid Build Coastguard Worker #include <set>
4*dbb99499SAndroid Build Coastguard Worker #include <vector>
5*dbb99499SAndroid Build Coastguard Worker
6*dbb99499SAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
7*dbb99499SAndroid Build Coastguard Worker
8*dbb99499SAndroid Build Coastguard Worker class MultipleRangesFixture : public ::benchmark::Fixture {
9*dbb99499SAndroid Build Coastguard Worker public:
MultipleRangesFixture()10*dbb99499SAndroid Build Coastguard Worker MultipleRangesFixture()
11*dbb99499SAndroid Build Coastguard Worker : expectedValues({{1, 3, 5},
12*dbb99499SAndroid Build Coastguard Worker {1, 3, 8},
13*dbb99499SAndroid Build Coastguard Worker {1, 3, 15},
14*dbb99499SAndroid Build Coastguard Worker {2, 3, 5},
15*dbb99499SAndroid Build Coastguard Worker {2, 3, 8},
16*dbb99499SAndroid Build Coastguard Worker {2, 3, 15},
17*dbb99499SAndroid Build Coastguard Worker {1, 4, 5},
18*dbb99499SAndroid Build Coastguard Worker {1, 4, 8},
19*dbb99499SAndroid Build Coastguard Worker {1, 4, 15},
20*dbb99499SAndroid Build Coastguard Worker {2, 4, 5},
21*dbb99499SAndroid Build Coastguard Worker {2, 4, 8},
22*dbb99499SAndroid Build Coastguard Worker {2, 4, 15},
23*dbb99499SAndroid Build Coastguard Worker {1, 7, 5},
24*dbb99499SAndroid Build Coastguard Worker {1, 7, 8},
25*dbb99499SAndroid Build Coastguard Worker {1, 7, 15},
26*dbb99499SAndroid Build Coastguard Worker {2, 7, 5},
27*dbb99499SAndroid Build Coastguard Worker {2, 7, 8},
28*dbb99499SAndroid Build Coastguard Worker {2, 7, 15},
29*dbb99499SAndroid Build Coastguard Worker {7, 6, 3}}) {}
30*dbb99499SAndroid Build Coastguard Worker
SetUp(const::benchmark::State & state)31*dbb99499SAndroid Build Coastguard Worker void SetUp(const ::benchmark::State& state) override {
32*dbb99499SAndroid Build Coastguard Worker std::vector<int64_t> ranges = {state.range(0), state.range(1),
33*dbb99499SAndroid Build Coastguard Worker state.range(2)};
34*dbb99499SAndroid Build Coastguard Worker
35*dbb99499SAndroid Build Coastguard Worker assert(expectedValues.find(ranges) != expectedValues.end());
36*dbb99499SAndroid Build Coastguard Worker
37*dbb99499SAndroid Build Coastguard Worker actualValues.insert(ranges);
38*dbb99499SAndroid Build Coastguard Worker }
39*dbb99499SAndroid Build Coastguard Worker
40*dbb99499SAndroid Build Coastguard Worker // NOTE: This is not TearDown as we want to check after _all_ runs are
41*dbb99499SAndroid Build Coastguard Worker // complete.
~MultipleRangesFixture()42*dbb99499SAndroid Build Coastguard Worker ~MultipleRangesFixture() override {
43*dbb99499SAndroid Build Coastguard Worker if (actualValues != expectedValues) {
44*dbb99499SAndroid Build Coastguard Worker std::cout << "EXPECTED\n";
45*dbb99499SAndroid Build Coastguard Worker for (const auto& v : expectedValues) {
46*dbb99499SAndroid Build Coastguard Worker std::cout << "{";
47*dbb99499SAndroid Build Coastguard Worker for (int64_t iv : v) {
48*dbb99499SAndroid Build Coastguard Worker std::cout << iv << ", ";
49*dbb99499SAndroid Build Coastguard Worker }
50*dbb99499SAndroid Build Coastguard Worker std::cout << "}\n";
51*dbb99499SAndroid Build Coastguard Worker }
52*dbb99499SAndroid Build Coastguard Worker std::cout << "ACTUAL\n";
53*dbb99499SAndroid Build Coastguard Worker for (const auto& v : actualValues) {
54*dbb99499SAndroid Build Coastguard Worker std::cout << "{";
55*dbb99499SAndroid Build Coastguard Worker for (int64_t iv : v) {
56*dbb99499SAndroid Build Coastguard Worker std::cout << iv << ", ";
57*dbb99499SAndroid Build Coastguard Worker }
58*dbb99499SAndroid Build Coastguard Worker std::cout << "}\n";
59*dbb99499SAndroid Build Coastguard Worker }
60*dbb99499SAndroid Build Coastguard Worker }
61*dbb99499SAndroid Build Coastguard Worker }
62*dbb99499SAndroid Build Coastguard Worker
63*dbb99499SAndroid Build Coastguard Worker std::set<std::vector<int64_t>> expectedValues;
64*dbb99499SAndroid Build Coastguard Worker std::set<std::vector<int64_t>> actualValues;
65*dbb99499SAndroid Build Coastguard Worker };
66*dbb99499SAndroid Build Coastguard Worker
BENCHMARK_DEFINE_F(MultipleRangesFixture,Empty)67*dbb99499SAndroid Build Coastguard Worker BENCHMARK_DEFINE_F(MultipleRangesFixture, Empty)(benchmark::State& state) {
68*dbb99499SAndroid Build Coastguard Worker for (auto _ : state) {
69*dbb99499SAndroid Build Coastguard Worker int64_t product = state.range(0) * state.range(1) * state.range(2);
70*dbb99499SAndroid Build Coastguard Worker for (int64_t x = 0; x < product; x++) {
71*dbb99499SAndroid Build Coastguard Worker benchmark::DoNotOptimize(x);
72*dbb99499SAndroid Build Coastguard Worker }
73*dbb99499SAndroid Build Coastguard Worker }
74*dbb99499SAndroid Build Coastguard Worker }
75*dbb99499SAndroid Build Coastguard Worker
76*dbb99499SAndroid Build Coastguard Worker BENCHMARK_REGISTER_F(MultipleRangesFixture, Empty)
77*dbb99499SAndroid Build Coastguard Worker ->RangeMultiplier(2)
78*dbb99499SAndroid Build Coastguard Worker ->Ranges({{1, 2}, {3, 7}, {5, 15}})
79*dbb99499SAndroid Build Coastguard Worker ->Args({7, 6, 3});
80*dbb99499SAndroid Build Coastguard Worker
BM_CheckDefaultArgument(benchmark::State & state)81*dbb99499SAndroid Build Coastguard Worker void BM_CheckDefaultArgument(benchmark::State& state) {
82*dbb99499SAndroid Build Coastguard Worker // Test that the 'range()' without an argument is the same as 'range(0)'.
83*dbb99499SAndroid Build Coastguard Worker assert(state.range() == state.range(0));
84*dbb99499SAndroid Build Coastguard Worker assert(state.range() != state.range(1));
85*dbb99499SAndroid Build Coastguard Worker for (auto _ : state) {
86*dbb99499SAndroid Build Coastguard Worker }
87*dbb99499SAndroid Build Coastguard Worker }
88*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_CheckDefaultArgument)->Ranges({{1, 5}, {6, 10}});
89*dbb99499SAndroid Build Coastguard Worker
BM_MultipleRanges(benchmark::State & st)90*dbb99499SAndroid Build Coastguard Worker static void BM_MultipleRanges(benchmark::State& st) {
91*dbb99499SAndroid Build Coastguard Worker for (auto _ : st) {
92*dbb99499SAndroid Build Coastguard Worker }
93*dbb99499SAndroid Build Coastguard Worker }
94*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MultipleRanges)->Ranges({{5, 5}, {6, 6}});
95*dbb99499SAndroid Build Coastguard Worker
96*dbb99499SAndroid Build Coastguard Worker BENCHMARK_MAIN();
97