Measurement.h revision 75fc5a74d95804e2ddc87bcade177640521147e0
1//
2//  Measurement.h
3//  PerfTestDriver
4//
5//  Created by Enrico Granata on 3/7/13.
6//  Copyright (c) 2013 Apple Inc. All rights reserved.
7//
8
9#ifndef __PerfTestDriver__Measurement__
10#define __PerfTestDriver__Measurement__
11
12#include "Gauge.h"
13#include "Timer.h"
14#include "Metric.h"
15#include "MemoryGauge.h"
16
17namespace lldb_perf
18{
19template <typename GaugeType, typename Action>
20class Measurement : public WriteToPList
21{
22public:
23    Measurement () :
24        m_gauge (),
25        m_action (),
26        m_metric ()
27    {
28    }
29
30    Measurement (Action act, const char* name = NULL, const char* desc = NULL)  :
31        m_gauge (),
32        m_action (act),
33        m_metric (Metric<typename GaugeType::SizeType>(name, desc))
34    {
35    }
36
37    template <typename GaugeType_Rhs, typename Action_Rhs>
38    Measurement (const Measurement<GaugeType_Rhs, Action_Rhs>& rhs) :
39        m_gauge(rhs.GetGauge()),
40        m_action(rhs.GetAction()),
41        m_metric(rhs.GetMetric())
42    {
43    }
44
45    template <typename... Args>
46    void
47    operator () (Args... args)
48    {
49        m_metric.Append (m_gauge.Measure(m_action, args...));
50    }
51
52    virtual const Action&
53    GetAction () const
54    {
55        return m_action;
56    }
57
58    virtual const GaugeType&
59    GetGauge () const
60    {
61        return m_gauge;
62    }
63
64    virtual const Metric<typename GaugeType::SizeType>&
65    GetMetric () const
66    {
67        return m_metric;
68    }
69
70    void
71    Start ()
72    {
73        m_gauge.Start();
74    }
75
76    typename GaugeType::SizeType
77    Stop ()
78    {
79        auto value = m_gauge.Stop();
80        m_metric.Append(value);
81        return value;
82    }
83
84    virtual void
85    Write (CFCMutableArray& parent)
86    {
87        m_metric.Write(parent);
88    }
89
90protected:
91    GaugeType m_gauge;
92    Action m_action;
93    Metric<typename GaugeType::SizeType> m_metric;
94};
95
96template <typename Action>
97class TimeMeasurement : public Measurement<TimeGauge,Action>
98{
99public:
100    TimeMeasurement () :
101        Measurement<TimeGauge,Action> ()
102    {
103    }
104
105    TimeMeasurement (Action act,
106                     const char* name = NULL,
107                     const char* descr = NULL) :
108        Measurement<TimeGauge,Action> (act, name, descr)
109    {
110    }
111
112    template <typename Action_Rhs>
113    TimeMeasurement (const TimeMeasurement<Action_Rhs>& rhs) :
114        Measurement<TimeGauge,Action>(rhs)
115    {
116    }
117
118    template <typename GaugeType_Rhs, typename Action_Rhs>
119    TimeMeasurement (const Measurement<GaugeType_Rhs, Action_Rhs>& rhs) :
120        Measurement<GaugeType_Rhs,Action_Rhs>(rhs)
121    {
122    }
123
124    template <typename... Args>
125    void
126    operator () (Args... args)
127    {
128        Measurement<TimeGauge,Action>::operator()(args...);
129    }
130};
131
132template <typename Action>
133class MemoryMeasurement : public Measurement<MemoryGauge,Action>
134{
135public:
136    MemoryMeasurement () : Measurement<MemoryGauge,Action> ()
137    {
138    }
139
140    MemoryMeasurement (Action act, const char* name = NULL, const char* descr = NULL) : Measurement<MemoryGauge,Action> (act, name, descr)
141    {
142    }
143
144    template <typename Action_Rhs>
145    MemoryMeasurement (const MemoryMeasurement<Action_Rhs>& rhs) : Measurement<MemoryGauge,Action>(rhs)
146    {
147    }
148
149    template <typename GaugeType_Rhs, typename Action_Rhs>
150    MemoryMeasurement (const Measurement<GaugeType_Rhs, Action_Rhs>& rhs) : Measurement<GaugeType_Rhs,Action_Rhs>(rhs)
151    {
152    }
153
154    template <typename... Args>
155    void
156    operator () (Args... args)
157    {
158        Measurement<MemoryGauge,Action>::operator()(args...);
159    }
160};
161
162}
163
164#endif /* defined(__PerfTestDriver__Measurement__) */
165