xref: /llvm-project/third-party/benchmark/test/multiple_ranges_test.cc (revision a5b797172cc902db166e9a695716fb81405f86e4)
15dda2efdSMircea Trofin #include <cassert>
25dda2efdSMircea Trofin #include <iostream>
35dda2efdSMircea Trofin #include <set>
45dda2efdSMircea Trofin #include <vector>
55dda2efdSMircea Trofin 
6a290770fSMircea Trofin #include "benchmark/benchmark.h"
7a290770fSMircea Trofin 
85dda2efdSMircea Trofin class MultipleRangesFixture : public ::benchmark::Fixture {
95dda2efdSMircea Trofin  public:
MultipleRangesFixture()105dda2efdSMircea Trofin   MultipleRangesFixture()
115dda2efdSMircea Trofin       : expectedValues({{1, 3, 5},
125dda2efdSMircea Trofin                         {1, 3, 8},
135dda2efdSMircea Trofin                         {1, 3, 15},
145dda2efdSMircea Trofin                         {2, 3, 5},
155dda2efdSMircea Trofin                         {2, 3, 8},
165dda2efdSMircea Trofin                         {2, 3, 15},
175dda2efdSMircea Trofin                         {1, 4, 5},
185dda2efdSMircea Trofin                         {1, 4, 8},
195dda2efdSMircea Trofin                         {1, 4, 15},
205dda2efdSMircea Trofin                         {2, 4, 5},
215dda2efdSMircea Trofin                         {2, 4, 8},
225dda2efdSMircea Trofin                         {2, 4, 15},
235dda2efdSMircea Trofin                         {1, 7, 5},
245dda2efdSMircea Trofin                         {1, 7, 8},
255dda2efdSMircea Trofin                         {1, 7, 15},
265dda2efdSMircea Trofin                         {2, 7, 5},
275dda2efdSMircea Trofin                         {2, 7, 8},
285dda2efdSMircea Trofin                         {2, 7, 15},
295dda2efdSMircea Trofin                         {7, 6, 3}}) {}
305dda2efdSMircea Trofin 
SetUp(const::benchmark::State & state)31*a5b79717SMircea Trofin   void SetUp(const ::benchmark::State& state) override {
325dda2efdSMircea Trofin     std::vector<int64_t> ranges = {state.range(0), state.range(1),
335dda2efdSMircea Trofin                                    state.range(2)};
345dda2efdSMircea Trofin 
355dda2efdSMircea Trofin     assert(expectedValues.find(ranges) != expectedValues.end());
365dda2efdSMircea Trofin 
375dda2efdSMircea Trofin     actualValues.insert(ranges);
385dda2efdSMircea Trofin   }
395dda2efdSMircea Trofin 
405dda2efdSMircea Trofin   // NOTE: This is not TearDown as we want to check after _all_ runs are
415dda2efdSMircea Trofin   // complete.
~MultipleRangesFixture()42*a5b79717SMircea Trofin   ~MultipleRangesFixture() override {
435dda2efdSMircea Trofin     if (actualValues != expectedValues) {
445dda2efdSMircea Trofin       std::cout << "EXPECTED\n";
45a290770fSMircea Trofin       for (const auto& v : expectedValues) {
465dda2efdSMircea Trofin         std::cout << "{";
475dda2efdSMircea Trofin         for (int64_t iv : v) {
485dda2efdSMircea Trofin           std::cout << iv << ", ";
495dda2efdSMircea Trofin         }
505dda2efdSMircea Trofin         std::cout << "}\n";
515dda2efdSMircea Trofin       }
525dda2efdSMircea Trofin       std::cout << "ACTUAL\n";
53a290770fSMircea Trofin       for (const auto& v : actualValues) {
545dda2efdSMircea Trofin         std::cout << "{";
555dda2efdSMircea Trofin         for (int64_t iv : v) {
565dda2efdSMircea Trofin           std::cout << iv << ", ";
575dda2efdSMircea Trofin         }
585dda2efdSMircea Trofin         std::cout << "}\n";
595dda2efdSMircea Trofin       }
605dda2efdSMircea Trofin     }
615dda2efdSMircea Trofin   }
625dda2efdSMircea Trofin 
635dda2efdSMircea Trofin   std::set<std::vector<int64_t>> expectedValues;
645dda2efdSMircea Trofin   std::set<std::vector<int64_t>> actualValues;
655dda2efdSMircea Trofin };
665dda2efdSMircea Trofin 
BENCHMARK_DEFINE_F(MultipleRangesFixture,Empty)675dda2efdSMircea Trofin BENCHMARK_DEFINE_F(MultipleRangesFixture, Empty)(benchmark::State& state) {
685dda2efdSMircea Trofin   for (auto _ : state) {
695dda2efdSMircea Trofin     int64_t product = state.range(0) * state.range(1) * state.range(2);
705dda2efdSMircea Trofin     for (int64_t x = 0; x < product; x++) {
715dda2efdSMircea Trofin       benchmark::DoNotOptimize(x);
725dda2efdSMircea Trofin     }
735dda2efdSMircea Trofin   }
745dda2efdSMircea Trofin }
755dda2efdSMircea Trofin 
765dda2efdSMircea Trofin BENCHMARK_REGISTER_F(MultipleRangesFixture, Empty)
775dda2efdSMircea Trofin     ->RangeMultiplier(2)
785dda2efdSMircea Trofin     ->Ranges({{1, 2}, {3, 7}, {5, 15}})
795dda2efdSMircea Trofin     ->Args({7, 6, 3});
805dda2efdSMircea Trofin 
BM_CheckDefaultArgument(benchmark::State & state)815dda2efdSMircea Trofin void BM_CheckDefaultArgument(benchmark::State& state) {
825dda2efdSMircea Trofin   // Test that the 'range()' without an argument is the same as 'range(0)'.
835dda2efdSMircea Trofin   assert(state.range() == state.range(0));
845dda2efdSMircea Trofin   assert(state.range() != state.range(1));
855dda2efdSMircea Trofin   for (auto _ : state) {
865dda2efdSMircea Trofin   }
875dda2efdSMircea Trofin }
885dda2efdSMircea Trofin BENCHMARK(BM_CheckDefaultArgument)->Ranges({{1, 5}, {6, 10}});
895dda2efdSMircea Trofin 
BM_MultipleRanges(benchmark::State & st)905dda2efdSMircea Trofin static void BM_MultipleRanges(benchmark::State& st) {
915dda2efdSMircea Trofin   for (auto _ : st) {
925dda2efdSMircea Trofin   }
935dda2efdSMircea Trofin }
945dda2efdSMircea Trofin BENCHMARK(BM_MultipleRanges)->Ranges({{5, 5}, {6, 6}});
955dda2efdSMircea Trofin 
965dda2efdSMircea Trofin BENCHMARK_MAIN();
97