1a8c51b3fSopenharmony_ci#ifndef BENCHMARK_TIMERS_H
2a8c51b3fSopenharmony_ci#define BENCHMARK_TIMERS_H
3a8c51b3fSopenharmony_ci
4a8c51b3fSopenharmony_ci#include <chrono>
5a8c51b3fSopenharmony_ci#include <string>
6a8c51b3fSopenharmony_ci
7a8c51b3fSopenharmony_cinamespace benchmark {
8a8c51b3fSopenharmony_ci
9a8c51b3fSopenharmony_ci// Return the CPU usage of the current process
10a8c51b3fSopenharmony_cidouble ProcessCPUUsage();
11a8c51b3fSopenharmony_ci
12a8c51b3fSopenharmony_ci// Return the CPU usage of the children of the current process
13a8c51b3fSopenharmony_cidouble ChildrenCPUUsage();
14a8c51b3fSopenharmony_ci
15a8c51b3fSopenharmony_ci// Return the CPU usage of the current thread
16a8c51b3fSopenharmony_cidouble ThreadCPUUsage();
17a8c51b3fSopenharmony_ci
18a8c51b3fSopenharmony_ci#if defined(HAVE_STEADY_CLOCK)
19a8c51b3fSopenharmony_citemplate <bool HighResIsSteady = std::chrono::high_resolution_clock::is_steady>
20a8c51b3fSopenharmony_cistruct ChooseSteadyClock {
21a8c51b3fSopenharmony_ci  typedef std::chrono::high_resolution_clock type;
22a8c51b3fSopenharmony_ci};
23a8c51b3fSopenharmony_ci
24a8c51b3fSopenharmony_citemplate <>
25a8c51b3fSopenharmony_cistruct ChooseSteadyClock<false> {
26a8c51b3fSopenharmony_ci  typedef std::chrono::steady_clock type;
27a8c51b3fSopenharmony_ci};
28a8c51b3fSopenharmony_ci#endif
29a8c51b3fSopenharmony_ci
30a8c51b3fSopenharmony_cistruct ChooseClockType {
31a8c51b3fSopenharmony_ci#if defined(HAVE_STEADY_CLOCK)
32a8c51b3fSopenharmony_ci  typedef ChooseSteadyClock<>::type type;
33a8c51b3fSopenharmony_ci#else
34a8c51b3fSopenharmony_ci  typedef std::chrono::high_resolution_clock type;
35a8c51b3fSopenharmony_ci#endif
36a8c51b3fSopenharmony_ci};
37a8c51b3fSopenharmony_ci
38a8c51b3fSopenharmony_ciinline double ChronoClockNow() {
39a8c51b3fSopenharmony_ci  typedef ChooseClockType::type ClockType;
40a8c51b3fSopenharmony_ci  using FpSeconds = std::chrono::duration<double, std::chrono::seconds::period>;
41a8c51b3fSopenharmony_ci  return FpSeconds(ClockType::now().time_since_epoch()).count();
42a8c51b3fSopenharmony_ci}
43a8c51b3fSopenharmony_ci
44a8c51b3fSopenharmony_cistd::string LocalDateTimeString();
45a8c51b3fSopenharmony_ci
46a8c51b3fSopenharmony_ci}  // end namespace benchmark
47a8c51b3fSopenharmony_ci
48a8c51b3fSopenharmony_ci#endif  // BENCHMARK_TIMERS_H
49