1a8c51b3fSopenharmony_ci#include <cstdarg> 2a8c51b3fSopenharmony_ci#undef NDEBUG 3a8c51b3fSopenharmony_ci 4a8c51b3fSopenharmony_ci#include "../src/commandlineflags.h" 5a8c51b3fSopenharmony_ci#include "../src/perf_counters.h" 6a8c51b3fSopenharmony_ci#include "benchmark/benchmark.h" 7a8c51b3fSopenharmony_ci#include "output_test.h" 8a8c51b3fSopenharmony_ci 9a8c51b3fSopenharmony_cinamespace benchmark { 10a8c51b3fSopenharmony_ci 11a8c51b3fSopenharmony_ciBM_DECLARE_string(benchmark_perf_counters); 12a8c51b3fSopenharmony_ci 13a8c51b3fSopenharmony_ci} // namespace benchmark 14a8c51b3fSopenharmony_ci 15a8c51b3fSopenharmony_cistatic void BM_Simple(benchmark::State& state) { 16a8c51b3fSopenharmony_ci for (auto _ : state) { 17a8c51b3fSopenharmony_ci auto iterations = state.iterations(); 18a8c51b3fSopenharmony_ci benchmark::DoNotOptimize(iterations); 19a8c51b3fSopenharmony_ci } 20a8c51b3fSopenharmony_ci} 21a8c51b3fSopenharmony_ciBENCHMARK(BM_Simple); 22a8c51b3fSopenharmony_ciADD_CASES(TC_JSONOut, {{"\"name\": \"BM_Simple\",$"}}); 23a8c51b3fSopenharmony_ci 24a8c51b3fSopenharmony_ciconst int kIters = 1000000; 25a8c51b3fSopenharmony_ci 26a8c51b3fSopenharmony_civoid BM_WithoutPauseResume(benchmark::State& state) { 27a8c51b3fSopenharmony_ci int n = 0; 28a8c51b3fSopenharmony_ci 29a8c51b3fSopenharmony_ci for (auto _ : state) { 30a8c51b3fSopenharmony_ci for (auto i = 0; i < kIters; ++i) { 31a8c51b3fSopenharmony_ci n = 1 - n; 32a8c51b3fSopenharmony_ci benchmark::DoNotOptimize(n); 33a8c51b3fSopenharmony_ci } 34a8c51b3fSopenharmony_ci } 35a8c51b3fSopenharmony_ci} 36a8c51b3fSopenharmony_ci 37a8c51b3fSopenharmony_ciBENCHMARK(BM_WithoutPauseResume); 38a8c51b3fSopenharmony_ciADD_CASES(TC_JSONOut, {{"\"name\": \"BM_WithoutPauseResume\",$"}}); 39a8c51b3fSopenharmony_ci 40a8c51b3fSopenharmony_civoid BM_WithPauseResume(benchmark::State& state) { 41a8c51b3fSopenharmony_ci int m = 0, n = 0; 42a8c51b3fSopenharmony_ci 43a8c51b3fSopenharmony_ci for (auto _ : state) { 44a8c51b3fSopenharmony_ci for (auto i = 0; i < kIters; ++i) { 45a8c51b3fSopenharmony_ci n = 1 - n; 46a8c51b3fSopenharmony_ci benchmark::DoNotOptimize(n); 47a8c51b3fSopenharmony_ci } 48a8c51b3fSopenharmony_ci 49a8c51b3fSopenharmony_ci state.PauseTiming(); 50a8c51b3fSopenharmony_ci for (auto j = 0; j < kIters; ++j) { 51a8c51b3fSopenharmony_ci m = 1 - m; 52a8c51b3fSopenharmony_ci benchmark::DoNotOptimize(m); 53a8c51b3fSopenharmony_ci } 54a8c51b3fSopenharmony_ci state.ResumeTiming(); 55a8c51b3fSopenharmony_ci } 56a8c51b3fSopenharmony_ci} 57a8c51b3fSopenharmony_ci 58a8c51b3fSopenharmony_ciBENCHMARK(BM_WithPauseResume); 59a8c51b3fSopenharmony_ci 60a8c51b3fSopenharmony_ciADD_CASES(TC_JSONOut, {{"\"name\": \"BM_WithPauseResume\",$"}}); 61a8c51b3fSopenharmony_ci 62a8c51b3fSopenharmony_cistatic void CheckSimple(Results const& e) { 63a8c51b3fSopenharmony_ci CHECK_COUNTER_VALUE(e, double, "CYCLES", GT, 0); 64a8c51b3fSopenharmony_ci} 65a8c51b3fSopenharmony_ci 66a8c51b3fSopenharmony_cidouble withoutPauseResumeInstrCount = 0.0; 67a8c51b3fSopenharmony_cidouble withPauseResumeInstrCount = 0.0; 68a8c51b3fSopenharmony_ci 69a8c51b3fSopenharmony_cistatic void SaveInstrCountWithoutResume(Results const& e) { 70a8c51b3fSopenharmony_ci withoutPauseResumeInstrCount = e.GetAs<double>("INSTRUCTIONS"); 71a8c51b3fSopenharmony_ci} 72a8c51b3fSopenharmony_ci 73a8c51b3fSopenharmony_cistatic void SaveInstrCountWithResume(Results const& e) { 74a8c51b3fSopenharmony_ci withPauseResumeInstrCount = e.GetAs<double>("INSTRUCTIONS"); 75a8c51b3fSopenharmony_ci} 76a8c51b3fSopenharmony_ci 77a8c51b3fSopenharmony_ciCHECK_BENCHMARK_RESULTS("BM_Simple", &CheckSimple); 78a8c51b3fSopenharmony_ciCHECK_BENCHMARK_RESULTS("BM_WithoutPauseResume", &SaveInstrCountWithoutResume); 79a8c51b3fSopenharmony_ciCHECK_BENCHMARK_RESULTS("BM_WithPauseResume", &SaveInstrCountWithResume); 80a8c51b3fSopenharmony_ci 81a8c51b3fSopenharmony_ciint main(int argc, char* argv[]) { 82a8c51b3fSopenharmony_ci if (!benchmark::internal::PerfCounters::kSupported) { 83a8c51b3fSopenharmony_ci return 0; 84a8c51b3fSopenharmony_ci } 85a8c51b3fSopenharmony_ci benchmark::FLAGS_benchmark_perf_counters = "CYCLES,INSTRUCTIONS"; 86a8c51b3fSopenharmony_ci benchmark::internal::PerfCounters::Initialize(); 87a8c51b3fSopenharmony_ci RunOutputTests(argc, argv); 88a8c51b3fSopenharmony_ci 89a8c51b3fSopenharmony_ci BM_CHECK_GT(withPauseResumeInstrCount, kIters); 90a8c51b3fSopenharmony_ci BM_CHECK_GT(withoutPauseResumeInstrCount, kIters); 91a8c51b3fSopenharmony_ci BM_CHECK_LT(withPauseResumeInstrCount, 1.5 * withoutPauseResumeInstrCount); 92a8c51b3fSopenharmony_ci} 93