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