#include <chrono>
#include <ctime>
#include <cstdint>
struct HighResClock
{
typedef long long rep;
typedef std::nano period;
typedef std::chrono::duration<rep, period> duration;
typedef std::chrono::time_point<HighResClock> time_point;
static const bool is_steady = true;
static time_point now();
};
class Timer
{
using SysClock = std::chrono::system_clock;
using Time = Timer::SysClock::time_point;
using Duration = Timer::SysClock::duration;
Time start_;
public:
Timer();
void Restart();
Duration TimeElapsed() const;
int64_t TimeElapsed_s() const;
int64_t TimeElapsed_ms() const;
int64_t TimeElapsed_us() const;
int64_t TimeElapsed_ns() const;
template<class unit>
int64_t TimeElapsed_T() const
{
return std::chrono::duration_cast<unit>(TimeElapsed()).count();
}
};
class HRTimer
{
using SysClock = HighResClock;
using Time = HRTimer::SysClock::time_point;
using Duration = HRTimer::SysClock::duration;
Time start_;
public:
HRTimer();
void Restart();
Duration TimeElapsed() const;
int64_t TimeElapsed_s() const;
int64_t TimeElapsed_ms() const;
int64_t TimeElapsed_us() const;
int64_t TimeElapsed_ns() const;
template<class unit>
int64_t TimeElapsed_T() const
{
return std::chrono::duration_cast<unit>(TimeElapsed()).count();
}
};