blob: c64acabc25c98d6319e473b08a96beb10eba3cd9 [file] [log] [blame]
Eric Fiselierf6e09e52016-08-09 18:56:48 +00001#include "benchmark/benchmark.h"
2
Eric Fiselierf6e09e52016-08-09 18:56:48 +00003#include <cassert>
Eric Fiselierfcafd3e2018-07-10 04:02:00 +00004#include <iostream>
Eric Fiselierfbc9ff22016-11-05 00:30:27 +00005#include <set>
Eric Fiselierfcafd3e2018-07-10 04:02:00 +00006#include <vector>
Eric Fiselierf6e09e52016-08-09 18:56:48 +00007
8class MultipleRangesFixture : public ::benchmark::Fixture {
9 public:
10 MultipleRangesFixture()
Eric Fiselierfbc9ff22016-11-05 00:30:27 +000011 : expectedValues({{1, 3, 5},
12 {1, 3, 8},
13 {1, 3, 15},
14 {2, 3, 5},
15 {2, 3, 8},
16 {2, 3, 15},
17 {1, 4, 5},
18 {1, 4, 8},
19 {1, 4, 15},
20 {2, 4, 5},
21 {2, 4, 8},
22 {2, 4, 15},
23 {1, 7, 5},
24 {1, 7, 8},
25 {1, 7, 15},
26 {2, 7, 5},
27 {2, 7, 8},
28 {2, 7, 15},
29 {7, 6, 3}}) {}
Eric Fiselierf6e09e52016-08-09 18:56:48 +000030
31 void SetUp(const ::benchmark::State& state) {
Eric Fiselierfcafd3e2018-07-10 04:02:00 +000032 std::vector<int64_t> ranges = {state.range(0), state.range(1),
33 state.range(2)};
Eric Fiselierf6e09e52016-08-09 18:56:48 +000034
35 assert(expectedValues.find(ranges) != expectedValues.end());
36
37 actualValues.insert(ranges);
38 }
39
Eric Fiselierfcafd3e2018-07-10 04:02:00 +000040 // NOTE: This is not TearDown as we want to check after _all_ runs are
41 // complete.
Eric Fiselierf6e09e52016-08-09 18:56:48 +000042 virtual ~MultipleRangesFixture() {
43 assert(actualValues.size() == expectedValues.size());
Eric Fiselierfcafd3e2018-07-10 04:02:00 +000044 if (actualValues.size() != expectedValues.size()) {
45 std::cout << "EXPECTED\n";
46 for (auto v : expectedValues) {
47 std::cout << "{";
48 for (int64_t iv : v) {
49 std::cout << iv << ", ";
50 }
51 std::cout << "}\n";
52 }
53 std::cout << "ACTUAL\n";
54 for (auto v : actualValues) {
55 std::cout << "{";
56 for (int64_t iv : v) {
57 std::cout << iv << ", ";
58 }
59 std::cout << "}\n";
60 }
61 }
Eric Fiselierf6e09e52016-08-09 18:56:48 +000062 }
Eric Fiselierfbc9ff22016-11-05 00:30:27 +000063
Eric Fiselierfcafd3e2018-07-10 04:02:00 +000064 std::set<std::vector<int64_t>> expectedValues;
65 std::set<std::vector<int64_t>> actualValues;
Eric Fiselierf6e09e52016-08-09 18:56:48 +000066};
67
Eric Fiselierf6e09e52016-08-09 18:56:48 +000068BENCHMARK_DEFINE_F(MultipleRangesFixture, Empty)(benchmark::State& state) {
Eric Fiselier19039762018-01-18 04:23:01 +000069 for (auto _ : state) {
Eric Fiselierfcafd3e2018-07-10 04:02:00 +000070 int64_t product = state.range(0) * state.range(1) * state.range(2);
71 for (int64_t x = 0; x < product; x++) {
Eric Fiselierf6e09e52016-08-09 18:56:48 +000072 benchmark::DoNotOptimize(x);
73 }
74 }
75}
76
Eric Fiselierfbc9ff22016-11-05 00:30:27 +000077BENCHMARK_REGISTER_F(MultipleRangesFixture, Empty)
78 ->RangeMultiplier(2)
79 ->Ranges({{1, 2}, {3, 7}, {5, 15}})
80 ->Args({7, 6, 3});
Eric Fiselier4d5e91d2016-08-29 19:12:01 +000081
82void BM_CheckDefaultArgument(benchmark::State& state) {
83 // Test that the 'range()' without an argument is the same as 'range(0)'.
84 assert(state.range() == state.range(0));
85 assert(state.range() != state.range(1));
Eric Fiselier19039762018-01-18 04:23:01 +000086 for (auto _ : state) {
Eric Fiselierfbc9ff22016-11-05 00:30:27 +000087 }
Eric Fiselier4d5e91d2016-08-29 19:12:01 +000088}
89BENCHMARK(BM_CheckDefaultArgument)->Ranges({{1, 5}, {6, 10}});
90
91static void BM_MultipleRanges(benchmark::State& st) {
Eric Fiselier19039762018-01-18 04:23:01 +000092 for (auto _ : st) {
Eric Fiselierfbc9ff22016-11-05 00:30:27 +000093 }
Eric Fiselier4d5e91d2016-08-29 19:12:01 +000094}
95BENCHMARK(BM_MultipleRanges)->Ranges({{5, 5}, {6, 6}});
96
Eric Fiselier19039762018-01-18 04:23:01 +000097BENCHMARK_MAIN();