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