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