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