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