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