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