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 18 namespace lldb_perf 19 { 20 template <typename GaugeType, typename Callable> 21 class Measurement 22 { 23 public: 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 115 void 116 WriteAverageAndStandardDeviation (Results &results) 117 { 118 auto metric = GetMetric (); 119 auto dictionary = (Results::Dictionary*)results.GetDictionary().Add(metric.GetName(), metric.GetDescription(), lldb_perf::GetResult<typename GaugeType::ValueType> (NULL, metric.GetAverage())).get(); 120 if (dictionary) 121 { 122 dictionary->Add("stddev", NULL, lldb_perf::GetResult<typename GaugeType::ValueType> (NULL, metric.GetStandardDeviation())); 123 } 124 } 125 126 void 127 WriteStandardDeviation (Results &results) 128 { 129 auto metric = GetMetric (); 130 results.GetDictionary().Add(metric.GetName(), metric.GetDescription(), lldb_perf::GetResult<typename GaugeType::ValueType> (NULL, metric.GetStandardDeviation())); 131 } 132 133 protected: 134 GaugeType m_gauge; 135 Callable m_callable; 136 Metric<typename GaugeType::ValueType> m_metric; 137 }; 138 139 template <typename Callable> 140 class TimeMeasurement : public Measurement<TimeGauge,Callable> 141 { 142 public: 143 TimeMeasurement () : 144 Measurement<TimeGauge,Callable> () 145 { 146 } 147 148 TimeMeasurement (Callable callable, 149 const char* name = NULL, 150 const char* descr = NULL) : 151 Measurement<TimeGauge,Callable> (callable, name, descr) 152 { 153 } 154 155 template <typename Callable_Rhs> 156 TimeMeasurement (const TimeMeasurement<Callable_Rhs>& rhs) : 157 Measurement<TimeGauge,Callable>(rhs) 158 { 159 } 160 161 template <typename GaugeType_Rhs, typename Callable_Rhs> 162 TimeMeasurement (const Measurement<GaugeType_Rhs, Callable_Rhs>& rhs) : 163 Measurement<GaugeType_Rhs,Callable_Rhs>(rhs) 164 { 165 } 166 167 template <typename... Args> 168 void 169 operator () (Args... args) 170 { 171 Measurement<TimeGauge,Callable>::operator()(args...); 172 } 173 }; 174 175 template <typename Callable> 176 class MemoryMeasurement : public Measurement<MemoryGauge,Callable> 177 { 178 public: 179 MemoryMeasurement () : Measurement<MemoryGauge,Callable> () 180 { 181 } 182 183 MemoryMeasurement (Callable callable, 184 const char* name, 185 const char* descr) : 186 Measurement<MemoryGauge,Callable> (callable, name, descr) 187 { 188 } 189 190 MemoryMeasurement (const char* name, const char* descr) : 191 Measurement<MemoryGauge,Callable> (name, descr) 192 { 193 } 194 195 template <typename Callable_Rhs> 196 MemoryMeasurement (const MemoryMeasurement<Callable_Rhs>& rhs) : 197 Measurement<MemoryGauge,Callable>(rhs) 198 { 199 } 200 201 template <typename GaugeType_Rhs, typename Callable_Rhs> 202 MemoryMeasurement (const Measurement<GaugeType_Rhs, Callable_Rhs>& rhs) : 203 Measurement<GaugeType_Rhs,Callable_Rhs>(rhs) 204 { 205 } 206 207 template <typename... Args> 208 void 209 operator () (Args... args) 210 { 211 Measurement<MemoryGauge,Callable>::operator()(args...); 212 } 213 }; 214 215 } 216 217 #endif /* defined(__PerfTestDriver__Measurement__) */ 218