xref: /llvm-project/third-party/benchmark/test/internal_threading_test.cc (revision a290770fa848cfe9b46dcc2c44e06e15cafd0f23)
15dda2efdSMircea Trofin 
25dda2efdSMircea Trofin #undef NDEBUG
35dda2efdSMircea Trofin 
45dda2efdSMircea Trofin #include <chrono>
55dda2efdSMircea Trofin #include <thread>
6*a290770fSMircea Trofin 
75dda2efdSMircea Trofin #include "../src/timers.h"
85dda2efdSMircea Trofin #include "benchmark/benchmark.h"
95dda2efdSMircea Trofin #include "output_test.h"
105dda2efdSMircea Trofin 
115dda2efdSMircea Trofin static const std::chrono::duration<double, std::milli> time_frame(50);
125dda2efdSMircea Trofin static const double time_frame_in_sec(
135dda2efdSMircea Trofin     std::chrono::duration_cast<std::chrono::duration<double, std::ratio<1, 1>>>(
145dda2efdSMircea Trofin         time_frame)
155dda2efdSMircea Trofin         .count());
165dda2efdSMircea Trofin 
MyBusySpinwait()175dda2efdSMircea Trofin void MyBusySpinwait() {
185dda2efdSMircea Trofin   const auto start = benchmark::ChronoClockNow();
195dda2efdSMircea Trofin 
205dda2efdSMircea Trofin   while (true) {
215dda2efdSMircea Trofin     const auto now = benchmark::ChronoClockNow();
225dda2efdSMircea Trofin     const auto elapsed = now - start;
235dda2efdSMircea Trofin 
245dda2efdSMircea Trofin     if (std::chrono::duration<double, std::chrono::seconds::period>(elapsed) >=
255dda2efdSMircea Trofin         time_frame)
265dda2efdSMircea Trofin       return;
275dda2efdSMircea Trofin   }
285dda2efdSMircea Trofin }
295dda2efdSMircea Trofin 
305dda2efdSMircea Trofin // ========================================================================= //
315dda2efdSMircea Trofin // --------------------------- TEST CASES BEGIN ---------------------------- //
325dda2efdSMircea Trofin // ========================================================================= //
335dda2efdSMircea Trofin 
345dda2efdSMircea Trofin // ========================================================================= //
355dda2efdSMircea Trofin // BM_MainThread
365dda2efdSMircea Trofin 
BM_MainThread(benchmark::State & state)375dda2efdSMircea Trofin void BM_MainThread(benchmark::State& state) {
385dda2efdSMircea Trofin   for (auto _ : state) {
395dda2efdSMircea Trofin     MyBusySpinwait();
405dda2efdSMircea Trofin     state.SetIterationTime(time_frame_in_sec);
415dda2efdSMircea Trofin   }
425dda2efdSMircea Trofin   state.counters["invtime"] =
435dda2efdSMircea Trofin       benchmark::Counter{1, benchmark::Counter::kIsRate};
445dda2efdSMircea Trofin }
455dda2efdSMircea Trofin 
465dda2efdSMircea Trofin BENCHMARK(BM_MainThread)->Iterations(1)->Threads(1);
475dda2efdSMircea Trofin BENCHMARK(BM_MainThread)->Iterations(1)->Threads(1)->UseRealTime();
485dda2efdSMircea Trofin BENCHMARK(BM_MainThread)->Iterations(1)->Threads(1)->UseManualTime();
495dda2efdSMircea Trofin BENCHMARK(BM_MainThread)->Iterations(1)->Threads(1)->MeasureProcessCPUTime();
505dda2efdSMircea Trofin BENCHMARK(BM_MainThread)
515dda2efdSMircea Trofin     ->Iterations(1)
525dda2efdSMircea Trofin     ->Threads(1)
535dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
545dda2efdSMircea Trofin     ->UseRealTime();
555dda2efdSMircea Trofin BENCHMARK(BM_MainThread)
565dda2efdSMircea Trofin     ->Iterations(1)
575dda2efdSMircea Trofin     ->Threads(1)
585dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
595dda2efdSMircea Trofin     ->UseManualTime();
605dda2efdSMircea Trofin 
615dda2efdSMircea Trofin BENCHMARK(BM_MainThread)->Iterations(1)->Threads(2);
625dda2efdSMircea Trofin BENCHMARK(BM_MainThread)->Iterations(1)->Threads(2)->UseRealTime();
635dda2efdSMircea Trofin BENCHMARK(BM_MainThread)->Iterations(1)->Threads(2)->UseManualTime();
645dda2efdSMircea Trofin BENCHMARK(BM_MainThread)->Iterations(1)->Threads(2)->MeasureProcessCPUTime();
655dda2efdSMircea Trofin BENCHMARK(BM_MainThread)
665dda2efdSMircea Trofin     ->Iterations(1)
675dda2efdSMircea Trofin     ->Threads(2)
685dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
695dda2efdSMircea Trofin     ->UseRealTime();
705dda2efdSMircea Trofin BENCHMARK(BM_MainThread)
715dda2efdSMircea Trofin     ->Iterations(1)
725dda2efdSMircea Trofin     ->Threads(2)
735dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
745dda2efdSMircea Trofin     ->UseManualTime();
755dda2efdSMircea Trofin 
765dda2efdSMircea Trofin // ========================================================================= //
775dda2efdSMircea Trofin // BM_WorkerThread
785dda2efdSMircea Trofin 
BM_WorkerThread(benchmark::State & state)795dda2efdSMircea Trofin void BM_WorkerThread(benchmark::State& state) {
805dda2efdSMircea Trofin   for (auto _ : state) {
815dda2efdSMircea Trofin     std::thread Worker(&MyBusySpinwait);
825dda2efdSMircea Trofin     Worker.join();
835dda2efdSMircea Trofin     state.SetIterationTime(time_frame_in_sec);
845dda2efdSMircea Trofin   }
855dda2efdSMircea Trofin   state.counters["invtime"] =
865dda2efdSMircea Trofin       benchmark::Counter{1, benchmark::Counter::kIsRate};
875dda2efdSMircea Trofin }
885dda2efdSMircea Trofin 
895dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(1);
905dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(1)->UseRealTime();
915dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(1)->UseManualTime();
925dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(1)->MeasureProcessCPUTime();
935dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)
945dda2efdSMircea Trofin     ->Iterations(1)
955dda2efdSMircea Trofin     ->Threads(1)
965dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
975dda2efdSMircea Trofin     ->UseRealTime();
985dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)
995dda2efdSMircea Trofin     ->Iterations(1)
1005dda2efdSMircea Trofin     ->Threads(1)
1015dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
1025dda2efdSMircea Trofin     ->UseManualTime();
1035dda2efdSMircea Trofin 
1045dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(2);
1055dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(2)->UseRealTime();
1065dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(2)->UseManualTime();
1075dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)->Iterations(1)->Threads(2)->MeasureProcessCPUTime();
1085dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)
1095dda2efdSMircea Trofin     ->Iterations(1)
1105dda2efdSMircea Trofin     ->Threads(2)
1115dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
1125dda2efdSMircea Trofin     ->UseRealTime();
1135dda2efdSMircea Trofin BENCHMARK(BM_WorkerThread)
1145dda2efdSMircea Trofin     ->Iterations(1)
1155dda2efdSMircea Trofin     ->Threads(2)
1165dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
1175dda2efdSMircea Trofin     ->UseManualTime();
1185dda2efdSMircea Trofin 
1195dda2efdSMircea Trofin // ========================================================================= //
1205dda2efdSMircea Trofin // BM_MainThreadAndWorkerThread
1215dda2efdSMircea Trofin 
BM_MainThreadAndWorkerThread(benchmark::State & state)1225dda2efdSMircea Trofin void BM_MainThreadAndWorkerThread(benchmark::State& state) {
1235dda2efdSMircea Trofin   for (auto _ : state) {
1245dda2efdSMircea Trofin     std::thread Worker(&MyBusySpinwait);
1255dda2efdSMircea Trofin     MyBusySpinwait();
1265dda2efdSMircea Trofin     Worker.join();
1275dda2efdSMircea Trofin     state.SetIterationTime(time_frame_in_sec);
1285dda2efdSMircea Trofin   }
1295dda2efdSMircea Trofin   state.counters["invtime"] =
1305dda2efdSMircea Trofin       benchmark::Counter{1, benchmark::Counter::kIsRate};
1315dda2efdSMircea Trofin }
1325dda2efdSMircea Trofin 
1335dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)->Iterations(1)->Threads(1);
1345dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)
1355dda2efdSMircea Trofin     ->Iterations(1)
1365dda2efdSMircea Trofin     ->Threads(1)
1375dda2efdSMircea Trofin     ->UseRealTime();
1385dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)
1395dda2efdSMircea Trofin     ->Iterations(1)
1405dda2efdSMircea Trofin     ->Threads(1)
1415dda2efdSMircea Trofin     ->UseManualTime();
1425dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)
1435dda2efdSMircea Trofin     ->Iterations(1)
1445dda2efdSMircea Trofin     ->Threads(1)
1455dda2efdSMircea Trofin     ->MeasureProcessCPUTime();
1465dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)
1475dda2efdSMircea Trofin     ->Iterations(1)
1485dda2efdSMircea Trofin     ->Threads(1)
1495dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
1505dda2efdSMircea Trofin     ->UseRealTime();
1515dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)
1525dda2efdSMircea Trofin     ->Iterations(1)
1535dda2efdSMircea Trofin     ->Threads(1)
1545dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
1555dda2efdSMircea Trofin     ->UseManualTime();
1565dda2efdSMircea Trofin 
1575dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)->Iterations(1)->Threads(2);
1585dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)
1595dda2efdSMircea Trofin     ->Iterations(1)
1605dda2efdSMircea Trofin     ->Threads(2)
1615dda2efdSMircea Trofin     ->UseRealTime();
1625dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)
1635dda2efdSMircea Trofin     ->Iterations(1)
1645dda2efdSMircea Trofin     ->Threads(2)
1655dda2efdSMircea Trofin     ->UseManualTime();
1665dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)
1675dda2efdSMircea Trofin     ->Iterations(1)
1685dda2efdSMircea Trofin     ->Threads(2)
1695dda2efdSMircea Trofin     ->MeasureProcessCPUTime();
1705dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)
1715dda2efdSMircea Trofin     ->Iterations(1)
1725dda2efdSMircea Trofin     ->Threads(2)
1735dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
1745dda2efdSMircea Trofin     ->UseRealTime();
1755dda2efdSMircea Trofin BENCHMARK(BM_MainThreadAndWorkerThread)
1765dda2efdSMircea Trofin     ->Iterations(1)
1775dda2efdSMircea Trofin     ->Threads(2)
1785dda2efdSMircea Trofin     ->MeasureProcessCPUTime()
1795dda2efdSMircea Trofin     ->UseManualTime();
1805dda2efdSMircea Trofin 
1815dda2efdSMircea Trofin // ========================================================================= //
1825dda2efdSMircea Trofin // ---------------------------- TEST CASES END ----------------------------- //
1835dda2efdSMircea Trofin // ========================================================================= //
1845dda2efdSMircea Trofin 
main(int argc,char * argv[])1855dda2efdSMircea Trofin int main(int argc, char* argv[]) { RunOutputTests(argc, argv); }
186