xref: /aosp_15_r20/external/google-benchmark/test/internal_threading_test.cc (revision dbb99499c3810fa1611fa2242a2fc446be01a57c)
1*dbb99499SAndroid Build Coastguard Worker 
2*dbb99499SAndroid Build Coastguard Worker #undef NDEBUG
3*dbb99499SAndroid Build Coastguard Worker 
4*dbb99499SAndroid Build Coastguard Worker #include <chrono>
5*dbb99499SAndroid Build Coastguard Worker #include <thread>
6*dbb99499SAndroid Build Coastguard Worker 
7*dbb99499SAndroid Build Coastguard Worker #include "../src/timers.h"
8*dbb99499SAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
9*dbb99499SAndroid Build Coastguard Worker #include "output_test.h"
10*dbb99499SAndroid Build Coastguard Worker 
11*dbb99499SAndroid Build Coastguard Worker static const std::chrono::duration<double, std::milli> time_frame(50);
12*dbb99499SAndroid Build Coastguard Worker static const double time_frame_in_sec(
13*dbb99499SAndroid Build Coastguard Worker     std::chrono::duration_cast<std::chrono::duration<double, std::ratio<1, 1>>>(
14*dbb99499SAndroid Build Coastguard Worker         time_frame)
15*dbb99499SAndroid Build Coastguard Worker         .count());
16*dbb99499SAndroid Build Coastguard Worker 
MyBusySpinwait()17*dbb99499SAndroid Build Coastguard Worker void MyBusySpinwait() {
18*dbb99499SAndroid Build Coastguard Worker   const auto start = benchmark::ChronoClockNow();
19*dbb99499SAndroid Build Coastguard Worker 
20*dbb99499SAndroid Build Coastguard Worker   while (true) {
21*dbb99499SAndroid Build Coastguard Worker     const auto now = benchmark::ChronoClockNow();
22*dbb99499SAndroid Build Coastguard Worker     const auto elapsed = now - start;
23*dbb99499SAndroid Build Coastguard Worker 
24*dbb99499SAndroid Build Coastguard Worker     if (std::chrono::duration<double, std::chrono::seconds::period>(elapsed) >=
25*dbb99499SAndroid Build Coastguard Worker         time_frame)
26*dbb99499SAndroid Build Coastguard Worker       return;
27*dbb99499SAndroid Build Coastguard Worker   }
28*dbb99499SAndroid Build Coastguard Worker }
29*dbb99499SAndroid Build Coastguard Worker 
30*dbb99499SAndroid Build Coastguard Worker // ========================================================================= //
31*dbb99499SAndroid Build Coastguard Worker // --------------------------- TEST CASES BEGIN ---------------------------- //
32*dbb99499SAndroid Build Coastguard Worker // ========================================================================= //
33*dbb99499SAndroid Build Coastguard Worker 
34*dbb99499SAndroid Build Coastguard Worker // ========================================================================= //
35*dbb99499SAndroid Build Coastguard Worker // BM_MainThread
36*dbb99499SAndroid Build Coastguard Worker 
BM_MainThread(benchmark::State & state)37*dbb99499SAndroid Build Coastguard Worker void BM_MainThread(benchmark::State& state) {
38*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
39*dbb99499SAndroid Build Coastguard Worker     MyBusySpinwait();
40*dbb99499SAndroid Build Coastguard Worker     state.SetIterationTime(time_frame_in_sec);
41*dbb99499SAndroid Build Coastguard Worker   }
42*dbb99499SAndroid Build Coastguard Worker   state.counters["invtime"] =
43*dbb99499SAndroid Build Coastguard Worker       benchmark::Counter{1, benchmark::Counter::kIsRate};
44*dbb99499SAndroid Build Coastguard Worker }
45*dbb99499SAndroid Build Coastguard Worker 
46*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)->Iterations(1)->Threads(1);
47*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)->Iterations(1)->Threads(1)->UseRealTime();
48*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)->Iterations(1)->Threads(1)->UseManualTime();
49*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)->Iterations(1)->Threads(1)->MeasureProcessCPUTime();
50*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)
51*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
52*dbb99499SAndroid Build Coastguard Worker     ->Threads(1)
53*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
54*dbb99499SAndroid Build Coastguard Worker     ->UseRealTime();
55*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)
56*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
57*dbb99499SAndroid Build Coastguard Worker     ->Threads(1)
58*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
59*dbb99499SAndroid Build Coastguard Worker     ->UseManualTime();
60*dbb99499SAndroid Build Coastguard Worker 
61*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)->Iterations(1)->Threads(2);
62*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)->Iterations(1)->Threads(2)->UseRealTime();
63*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)->Iterations(1)->Threads(2)->UseManualTime();
64*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)->Iterations(1)->Threads(2)->MeasureProcessCPUTime();
65*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)
66*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
67*dbb99499SAndroid Build Coastguard Worker     ->Threads(2)
68*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
69*dbb99499SAndroid Build Coastguard Worker     ->UseRealTime();
70*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThread)
71*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
72*dbb99499SAndroid Build Coastguard Worker     ->Threads(2)
73*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
74*dbb99499SAndroid Build Coastguard Worker     ->UseManualTime();
75*dbb99499SAndroid Build Coastguard Worker 
76*dbb99499SAndroid Build Coastguard Worker // ========================================================================= //
77*dbb99499SAndroid Build Coastguard Worker // BM_WorkerThread
78*dbb99499SAndroid Build Coastguard Worker 
BM_WorkerThread(benchmark::State & state)79*dbb99499SAndroid Build Coastguard Worker void BM_WorkerThread(benchmark::State& state) {
80*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
81*dbb99499SAndroid Build Coastguard Worker     std::thread Worker(&MyBusySpinwait);
82*dbb99499SAndroid Build Coastguard Worker     Worker.join();
83*dbb99499SAndroid Build Coastguard Worker     state.SetIterationTime(time_frame_in_sec);
84*dbb99499SAndroid Build Coastguard Worker   }
85*dbb99499SAndroid Build Coastguard Worker   state.counters["invtime"] =
86*dbb99499SAndroid Build Coastguard Worker       benchmark::Counter{1, benchmark::Counter::kIsRate};
87*dbb99499SAndroid Build Coastguard Worker }
88*dbb99499SAndroid Build Coastguard Worker 
89*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(1);
90*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(1)->UseRealTime();
91*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(1)->UseManualTime();
92*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(1)->MeasureProcessCPUTime();
93*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)
94*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
95*dbb99499SAndroid Build Coastguard Worker     ->Threads(1)
96*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
97*dbb99499SAndroid Build Coastguard Worker     ->UseRealTime();
98*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)
99*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
100*dbb99499SAndroid Build Coastguard Worker     ->Threads(1)
101*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
102*dbb99499SAndroid Build Coastguard Worker     ->UseManualTime();
103*dbb99499SAndroid Build Coastguard Worker 
104*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(2);
105*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(2)->UseRealTime();
106*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(2)->UseManualTime();
107*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(2)->MeasureProcessCPUTime();
108*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)
109*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
110*dbb99499SAndroid Build Coastguard Worker     ->Threads(2)
111*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
112*dbb99499SAndroid Build Coastguard Worker     ->UseRealTime();
113*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_WorkerThread)
114*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
115*dbb99499SAndroid Build Coastguard Worker     ->Threads(2)
116*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
117*dbb99499SAndroid Build Coastguard Worker     ->UseManualTime();
118*dbb99499SAndroid Build Coastguard Worker 
119*dbb99499SAndroid Build Coastguard Worker // ========================================================================= //
120*dbb99499SAndroid Build Coastguard Worker // BM_MainThreadAndWorkerThread
121*dbb99499SAndroid Build Coastguard Worker 
BM_MainThreadAndWorkerThread(benchmark::State & state)122*dbb99499SAndroid Build Coastguard Worker void BM_MainThreadAndWorkerThread(benchmark::State& state) {
123*dbb99499SAndroid Build Coastguard Worker   for (auto _ : state) {
124*dbb99499SAndroid Build Coastguard Worker     std::thread Worker(&MyBusySpinwait);
125*dbb99499SAndroid Build Coastguard Worker     MyBusySpinwait();
126*dbb99499SAndroid Build Coastguard Worker     Worker.join();
127*dbb99499SAndroid Build Coastguard Worker     state.SetIterationTime(time_frame_in_sec);
128*dbb99499SAndroid Build Coastguard Worker   }
129*dbb99499SAndroid Build Coastguard Worker   state.counters["invtime"] =
130*dbb99499SAndroid Build Coastguard Worker       benchmark::Counter{1, benchmark::Counter::kIsRate};
131*dbb99499SAndroid Build Coastguard Worker }
132*dbb99499SAndroid Build Coastguard Worker 
133*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)->Iterations(1)->Threads(1);
134*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)
135*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
136*dbb99499SAndroid Build Coastguard Worker     ->Threads(1)
137*dbb99499SAndroid Build Coastguard Worker     ->UseRealTime();
138*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)
139*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
140*dbb99499SAndroid Build Coastguard Worker     ->Threads(1)
141*dbb99499SAndroid Build Coastguard Worker     ->UseManualTime();
142*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)
143*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
144*dbb99499SAndroid Build Coastguard Worker     ->Threads(1)
145*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime();
146*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)
147*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
148*dbb99499SAndroid Build Coastguard Worker     ->Threads(1)
149*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
150*dbb99499SAndroid Build Coastguard Worker     ->UseRealTime();
151*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)
152*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
153*dbb99499SAndroid Build Coastguard Worker     ->Threads(1)
154*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
155*dbb99499SAndroid Build Coastguard Worker     ->UseManualTime();
156*dbb99499SAndroid Build Coastguard Worker 
157*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)->Iterations(1)->Threads(2);
158*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)
159*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
160*dbb99499SAndroid Build Coastguard Worker     ->Threads(2)
161*dbb99499SAndroid Build Coastguard Worker     ->UseRealTime();
162*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)
163*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
164*dbb99499SAndroid Build Coastguard Worker     ->Threads(2)
165*dbb99499SAndroid Build Coastguard Worker     ->UseManualTime();
166*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)
167*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
168*dbb99499SAndroid Build Coastguard Worker     ->Threads(2)
169*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime();
170*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)
171*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
172*dbb99499SAndroid Build Coastguard Worker     ->Threads(2)
173*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
174*dbb99499SAndroid Build Coastguard Worker     ->UseRealTime();
175*dbb99499SAndroid Build Coastguard Worker BENCHMARK(BM_MainThreadAndWorkerThread)
176*dbb99499SAndroid Build Coastguard Worker     ->Iterations(1)
177*dbb99499SAndroid Build Coastguard Worker     ->Threads(2)
178*dbb99499SAndroid Build Coastguard Worker     ->MeasureProcessCPUTime()
179*dbb99499SAndroid Build Coastguard Worker     ->UseManualTime();
180*dbb99499SAndroid Build Coastguard Worker 
181*dbb99499SAndroid Build Coastguard Worker // ========================================================================= //
182*dbb99499SAndroid Build Coastguard Worker // ---------------------------- TEST CASES END ----------------------------- //
183*dbb99499SAndroid Build Coastguard Worker // ========================================================================= //
184*dbb99499SAndroid Build Coastguard Worker 
main(int argc,char * argv[])185*dbb99499SAndroid Build Coastguard Worker int main(int argc, char* argv[]) { RunOutputTests(argc, argv); }
186