1a8c51b3fSopenharmony_ci#include <cassert> 2a8c51b3fSopenharmony_ci#include <iostream> 3a8c51b3fSopenharmony_ci#include <set> 4a8c51b3fSopenharmony_ci#include <vector> 5a8c51b3fSopenharmony_ci 6a8c51b3fSopenharmony_ci#include "benchmark/benchmark.h" 7a8c51b3fSopenharmony_ci 8a8c51b3fSopenharmony_ciclass ArgsProductFixture : public ::benchmark::Fixture { 9a8c51b3fSopenharmony_ci public: 10a8c51b3fSopenharmony_ci ArgsProductFixture() 11a8c51b3fSopenharmony_ci : expectedValues({{0, 100, 2000, 30000}, 12a8c51b3fSopenharmony_ci {1, 15, 3, 8}, 13a8c51b3fSopenharmony_ci {1, 15, 3, 9}, 14a8c51b3fSopenharmony_ci {1, 15, 7, 8}, 15a8c51b3fSopenharmony_ci {1, 15, 7, 9}, 16a8c51b3fSopenharmony_ci {1, 15, 10, 8}, 17a8c51b3fSopenharmony_ci {1, 15, 10, 9}, 18a8c51b3fSopenharmony_ci {2, 15, 3, 8}, 19a8c51b3fSopenharmony_ci {2, 15, 3, 9}, 20a8c51b3fSopenharmony_ci {2, 15, 7, 8}, 21a8c51b3fSopenharmony_ci {2, 15, 7, 9}, 22a8c51b3fSopenharmony_ci {2, 15, 10, 8}, 23a8c51b3fSopenharmony_ci {2, 15, 10, 9}, 24a8c51b3fSopenharmony_ci {4, 5, 6, 11}}) {} 25a8c51b3fSopenharmony_ci 26a8c51b3fSopenharmony_ci void SetUp(const ::benchmark::State& state) override { 27a8c51b3fSopenharmony_ci std::vector<int64_t> ranges = {state.range(0), state.range(1), 28a8c51b3fSopenharmony_ci state.range(2), state.range(3)}; 29a8c51b3fSopenharmony_ci 30a8c51b3fSopenharmony_ci assert(expectedValues.find(ranges) != expectedValues.end()); 31a8c51b3fSopenharmony_ci 32a8c51b3fSopenharmony_ci actualValues.insert(ranges); 33a8c51b3fSopenharmony_ci } 34a8c51b3fSopenharmony_ci 35a8c51b3fSopenharmony_ci // NOTE: This is not TearDown as we want to check after _all_ runs are 36a8c51b3fSopenharmony_ci // complete. 37a8c51b3fSopenharmony_ci ~ArgsProductFixture() override { 38a8c51b3fSopenharmony_ci if (actualValues != expectedValues) { 39a8c51b3fSopenharmony_ci std::cout << "EXPECTED\n"; 40a8c51b3fSopenharmony_ci for (const auto& v : expectedValues) { 41a8c51b3fSopenharmony_ci std::cout << "{"; 42a8c51b3fSopenharmony_ci for (int64_t iv : v) { 43a8c51b3fSopenharmony_ci std::cout << iv << ", "; 44a8c51b3fSopenharmony_ci } 45a8c51b3fSopenharmony_ci std::cout << "}\n"; 46a8c51b3fSopenharmony_ci } 47a8c51b3fSopenharmony_ci std::cout << "ACTUAL\n"; 48a8c51b3fSopenharmony_ci for (const auto& v : actualValues) { 49a8c51b3fSopenharmony_ci std::cout << "{"; 50a8c51b3fSopenharmony_ci for (int64_t iv : v) { 51a8c51b3fSopenharmony_ci std::cout << iv << ", "; 52a8c51b3fSopenharmony_ci } 53a8c51b3fSopenharmony_ci std::cout << "}\n"; 54a8c51b3fSopenharmony_ci } 55a8c51b3fSopenharmony_ci } 56a8c51b3fSopenharmony_ci } 57a8c51b3fSopenharmony_ci 58a8c51b3fSopenharmony_ci std::set<std::vector<int64_t>> expectedValues; 59a8c51b3fSopenharmony_ci std::set<std::vector<int64_t>> actualValues; 60a8c51b3fSopenharmony_ci}; 61a8c51b3fSopenharmony_ci 62a8c51b3fSopenharmony_ciBENCHMARK_DEFINE_F(ArgsProductFixture, Empty)(benchmark::State& state) { 63a8c51b3fSopenharmony_ci for (auto _ : state) { 64a8c51b3fSopenharmony_ci int64_t product = 65a8c51b3fSopenharmony_ci state.range(0) * state.range(1) * state.range(2) * state.range(3); 66a8c51b3fSopenharmony_ci for (int64_t x = 0; x < product; x++) { 67a8c51b3fSopenharmony_ci benchmark::DoNotOptimize(x); 68a8c51b3fSopenharmony_ci } 69a8c51b3fSopenharmony_ci } 70a8c51b3fSopenharmony_ci} 71a8c51b3fSopenharmony_ci 72a8c51b3fSopenharmony_ciBENCHMARK_REGISTER_F(ArgsProductFixture, Empty) 73a8c51b3fSopenharmony_ci ->Args({0, 100, 2000, 30000}) 74a8c51b3fSopenharmony_ci ->ArgsProduct({{1, 2}, {15}, {3, 7, 10}, {8, 9}}) 75a8c51b3fSopenharmony_ci ->Args({4, 5, 6, 11}); 76a8c51b3fSopenharmony_ci 77a8c51b3fSopenharmony_ciBENCHMARK_MAIN(); 78