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