Measurement.h revision d2c50b1793f69af4d09b5ba364dc0a1a88ec26f5
1//===-- Measurement.h -------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef __PerfTestDriver__Measurement__
11#define __PerfTestDriver__Measurement__
12
13#include "Gauge.h"
14#include "Timer.h"
15#include "Metric.h"
16#include "MemoryGauge.h"
17
18namespace lldb_perf
19{
20template <typename GaugeType, typename Callable>
21class Measurement
22{
23public:
24    Measurement () :
25        m_gauge (),
26        m_callable (),
27        m_metric ()
28    {
29    }
30
31    Measurement (Callable callable, const char* name, const char* desc)  :
32        m_gauge (),
33        m_callable (callable),
34        m_metric (Metric<typename GaugeType::ValueType>(name, desc))
35    {
36    }
37
38    Measurement (const char* name, const char* desc)  :
39        m_gauge (),
40        m_callable (),
41        m_metric (Metric<typename GaugeType::ValueType>(name, desc))
42    {
43    }
44
45    template <typename GaugeType_Rhs, typename Callable_Rhs>
46    Measurement (const Measurement<GaugeType_Rhs, Callable_Rhs>& rhs) :
47        m_gauge(rhs.GetGauge()),
48        m_callable(rhs.GetCallable()),
49        m_metric(rhs.GetMetric())
50    {
51    }
52
53    template <typename... Args>
54    void
55    operator () (Args... args)
56    {
57        m_gauge.Start();
58        m_callable(args...);
59        m_metric.Append (m_gauge.Stop());
60    }
61
62    virtual const Callable&
63    GetCallable () const
64    {
65        return m_callable;
66    }
67
68    virtual const GaugeType&
69    GetGauge () const
70    {
71        return m_gauge;
72    }
73
74    virtual const Metric<typename GaugeType::ValueType>&
75    GetMetric () const
76    {
77        return m_metric;
78    }
79
80    void
81    Start ()
82    {
83        m_gauge.Start();
84    }
85
86    typename GaugeType::ValueType
87    Stop ()
88    {
89        auto value = m_gauge.Stop();
90        m_metric.Append(value);
91        return value;
92    }
93
94    void
95    WriteStartValue (Results &results)
96    {
97        auto metric = GetMetric ();
98        results.GetDictionary().Add(metric.GetName(), metric.GetDescription(), lldb_perf::GetResult<typename GaugeType::ValueType> (NULL, metric.GetStartValue()));
99    }
100
101    void
102    WriteStopValue (Results &results)
103    {
104        auto metric = GetMetric ();
105        results.GetDictionary().Add(metric.GetName(), metric.GetDescription(), lldb_perf::GetResult<typename GaugeType::ValueType> (NULL, metric.GetStopValue()));
106    }
107
108    void
109    WriteAverageValue (Results &results)
110    {
111        auto metric = GetMetric ();
112        results.GetDictionary().Add(metric.GetName(), metric.GetDescription(), lldb_perf::GetResult<typename GaugeType::ValueType> (NULL, metric.GetAverage()));
113    }
114
115protected:
116    GaugeType m_gauge;
117    Callable m_callable;
118    Metric<typename GaugeType::ValueType> m_metric;
119};
120
121template <typename Callable>
122class TimeMeasurement : public Measurement<TimeGauge,Callable>
123{
124public:
125    TimeMeasurement () :
126        Measurement<TimeGauge,Callable> ()
127    {
128    }
129
130    TimeMeasurement (Callable callable,
131                     const char* name = NULL,
132                     const char* descr = NULL) :
133        Measurement<TimeGauge,Callable> (callable, name, descr)
134    {
135    }
136
137    template <typename Callable_Rhs>
138    TimeMeasurement (const TimeMeasurement<Callable_Rhs>& rhs) :
139        Measurement<TimeGauge,Callable>(rhs)
140    {
141    }
142
143    template <typename GaugeType_Rhs, typename Callable_Rhs>
144    TimeMeasurement (const Measurement<GaugeType_Rhs, Callable_Rhs>& rhs) :
145        Measurement<GaugeType_Rhs,Callable_Rhs>(rhs)
146    {
147    }
148
149    template <typename... Args>
150    void
151    operator () (Args... args)
152    {
153        Measurement<TimeGauge,Callable>::operator()(args...);
154    }
155};
156
157template <typename Callable>
158class MemoryMeasurement : public Measurement<MemoryGauge,Callable>
159{
160public:
161    MemoryMeasurement () : Measurement<MemoryGauge,Callable> ()
162    {
163    }
164
165    MemoryMeasurement (Callable callable,
166                       const char* name,
167                       const char* descr) :
168        Measurement<MemoryGauge,Callable> (callable, name, descr)
169    {
170    }
171
172    MemoryMeasurement (const char* name, const char* descr) :
173        Measurement<MemoryGauge,Callable> (name, descr)
174    {
175    }
176
177    template <typename Callable_Rhs>
178    MemoryMeasurement (const MemoryMeasurement<Callable_Rhs>& rhs) :
179        Measurement<MemoryGauge,Callable>(rhs)
180    {
181    }
182
183    template <typename GaugeType_Rhs, typename Callable_Rhs>
184    MemoryMeasurement (const Measurement<GaugeType_Rhs, Callable_Rhs>& rhs) :
185        Measurement<GaugeType_Rhs,Callable_Rhs>(rhs)
186    {
187    }
188
189    template <typename... Args>
190    void
191    operator () (Args... args)
192    {
193        Measurement<MemoryGauge,Callable>::operator()(args...);
194    }
195};
196
197}
198
199#endif /* defined(__PerfTestDriver__Measurement__) */
200