1d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton//===-- Timer.cpp -----------------------------------------------*- C++ -*-===//
2f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata//
3d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton//                     The LLVM Compiler Infrastructure
4f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata//
5d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton// This file is distributed under the University of Illinois Open Source
6d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton// License. See LICENSE.TXT for details.
7f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata//
8d3a8d6565ff40fd99533f50a085ace806a9300eeGreg Clayton//===----------------------------------------------------------------------===//
9f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
10f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata#include "Timer.h"
11f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata#include <assert.h>
12f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
13af222500aa2ce2b18149277e561cdf75f2115df2Greg Claytonusing namespace lldb_perf;
14f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
1575fc5a74d95804e2ddc87bcade177640521147e0Greg ClaytonTimeGauge::TimeType
1675fc5a74d95804e2ddc87bcade177640521147e0Greg ClaytonTimeGauge::Now ()
17f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{
18f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata	return high_resolution_clock::now();
19f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata}
20f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
21f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico GranataTimeGauge::TimeGauge () :
229de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton    m_start(),
2375fc5a74d95804e2ddc87bcade177640521147e0Greg Clayton    m_state(TimeGauge::State::eNeverUsed)
24f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{
25f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata}
26f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
27f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granatavoid
2875fc5a74d95804e2ddc87bcade177640521147e0Greg ClaytonTimeGauge::Start ()
29f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{
3075fc5a74d95804e2ddc87bcade177640521147e0Greg Clayton	m_state = TimeGauge::State::eCounting;
3175fc5a74d95804e2ddc87bcade177640521147e0Greg Clayton	m_start = Now();
32f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata}
33f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
34f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granatadouble
3575fc5a74d95804e2ddc87bcade177640521147e0Greg ClaytonTimeGauge::Stop ()
36f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{
379de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton	m_stop = Now();
3875fc5a74d95804e2ddc87bcade177640521147e0Greg Clayton	assert(m_state == TimeGauge::State::eCounting && "cannot stop a non-started clock");
3975fc5a74d95804e2ddc87bcade177640521147e0Greg Clayton	m_state = TimeGauge::State::eStopped;
409de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton    m_delta = duration_cast<duration<double>>(m_stop-m_start).count();
419de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton	return m_delta;
429de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton}
439de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton
449de4dec874148d30cc1d4c498d38cd048a8164caGreg Claytondouble
459de4dec874148d30cc1d4c498d38cd048a8164caGreg ClaytonTimeGauge::GetStartValue () const
469de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton{
479de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton    return (double)m_start.time_since_epoch().count() * (double)system_clock::period::num / (double)system_clock::period::den;
489de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton}
499de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton
509de4dec874148d30cc1d4c498d38cd048a8164caGreg Claytondouble
519de4dec874148d30cc1d4c498d38cd048a8164caGreg ClaytonTimeGauge::GetStopValue () const
529de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton{
539de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton    return (double)m_stop.time_since_epoch().count() * (double)system_clock::period::num / (double)system_clock::period::den;
54f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata}
55f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata
56f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granatadouble
579de4dec874148d30cc1d4c498d38cd048a8164caGreg ClaytonTimeGauge::GetDeltaValue () const
58f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata{
5975fc5a74d95804e2ddc87bcade177640521147e0Greg Clayton	assert(m_state == TimeGauge::State::eStopped && "clock must be used before you can evaluate it");
609de4dec874148d30cc1d4c498d38cd048a8164caGreg Clayton	return m_delta;
61f5af85a2946ed4e1ff4766829d328cfb4961f259Enrico Granata}
62