forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			159 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- Measurement.h -------------------------------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef __PerfTestDriver__Measurement__
 | |
| #define __PerfTestDriver__Measurement__
 | |
| 
 | |
| #include "Gauge.h"
 | |
| #include "MemoryGauge.h"
 | |
| #include "Metric.h"
 | |
| #include "Timer.h"
 | |
| 
 | |
| namespace lldb_perf {
 | |
| template <typename GaugeType, typename Callable> class Measurement {
 | |
| public:
 | |
|   Measurement() : m_gauge(), m_callable(), m_metric() {}
 | |
| 
 | |
|   Measurement(Callable callable, const char *name, const char *desc)
 | |
|       : m_gauge(), m_callable(callable),
 | |
|         m_metric(Metric<typename GaugeType::ValueType>(name, desc)) {}
 | |
| 
 | |
|   Measurement(const char *name, const char *desc)
 | |
|       : m_gauge(), m_callable(),
 | |
|         m_metric(Metric<typename GaugeType::ValueType>(name, desc)) {}
 | |
| 
 | |
|   template <typename GaugeType_Rhs, typename Callable_Rhs>
 | |
|   Measurement(const Measurement<GaugeType_Rhs, Callable_Rhs> &rhs)
 | |
|       : m_gauge(rhs.GetGauge()), m_callable(rhs.GetCallable()),
 | |
|         m_metric(rhs.GetMetric()) {}
 | |
| 
 | |
|   template <typename... Args> void operator()(Args... args) {
 | |
|     m_gauge.Start();
 | |
|     m_callable(args...);
 | |
|     m_metric.Append(m_gauge.Stop());
 | |
|   }
 | |
| 
 | |
|   virtual const Callable &GetCallable() const { return m_callable; }
 | |
| 
 | |
|   virtual const GaugeType &GetGauge() const { return m_gauge; }
 | |
| 
 | |
|   virtual const Metric<typename GaugeType::ValueType> &GetMetric() const {
 | |
|     return m_metric;
 | |
|   }
 | |
| 
 | |
|   void Start() { m_gauge.Start(); }
 | |
| 
 | |
|   typename GaugeType::ValueType Stop() {
 | |
|     auto value = m_gauge.Stop();
 | |
|     m_metric.Append(value);
 | |
|     return value;
 | |
|   }
 | |
| 
 | |
|   void WriteStartValue(Results &results) {
 | |
|     auto metric = GetMetric();
 | |
|     results.GetDictionary().Add(
 | |
|         metric.GetName(), metric.GetDescription(),
 | |
|         lldb_perf::GetResult<typename GaugeType::ValueType>(
 | |
|             NULL, metric.GetStartValue()));
 | |
|   }
 | |
| 
 | |
|   void WriteStopValue(Results &results) {
 | |
|     auto metric = GetMetric();
 | |
|     results.GetDictionary().Add(
 | |
|         metric.GetName(), metric.GetDescription(),
 | |
|         lldb_perf::GetResult<typename GaugeType::ValueType>(
 | |
|             NULL, metric.GetStopValue()));
 | |
|   }
 | |
| 
 | |
|   void WriteAverageValue(Results &results) {
 | |
|     auto metric = GetMetric();
 | |
|     results.GetDictionary().Add(
 | |
|         metric.GetName(), metric.GetDescription(),
 | |
|         lldb_perf::GetResult<typename GaugeType::ValueType>(
 | |
|             NULL, metric.GetAverage()));
 | |
|   }
 | |
| 
 | |
|   void WriteAverageAndStandardDeviation(Results &results) {
 | |
|     auto metric = GetMetric();
 | |
|     auto dictionary =
 | |
|         (Results::Dictionary *)results.GetDictionary()
 | |
|             .Add(metric.GetName(), metric.GetDescription(),
 | |
|                  lldb_perf::GetResult<typename GaugeType::ValueType>(
 | |
|                      NULL, metric.GetAverage()))
 | |
|             .get();
 | |
|     if (dictionary) {
 | |
|       dictionary->Add("stddev", NULL,
 | |
|                       lldb_perf::GetResult<typename GaugeType::ValueType>(
 | |
|                           NULL, metric.GetStandardDeviation()));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void WriteStandardDeviation(Results &results) {
 | |
|     auto metric = GetMetric();
 | |
|     results.GetDictionary().Add(
 | |
|         metric.GetName(), metric.GetDescription(),
 | |
|         lldb_perf::GetResult<typename GaugeType::ValueType>(
 | |
|             NULL, metric.GetStandardDeviation()));
 | |
|   }
 | |
| 
 | |
| protected:
 | |
|   GaugeType m_gauge;
 | |
|   Callable m_callable;
 | |
|   Metric<typename GaugeType::ValueType> m_metric;
 | |
| };
 | |
| 
 | |
| template <typename Callable>
 | |
| class TimeMeasurement : public Measurement<TimeGauge, Callable> {
 | |
| public:
 | |
|   TimeMeasurement() : Measurement<TimeGauge, Callable>() {}
 | |
| 
 | |
|   TimeMeasurement(Callable callable, const char *name = NULL,
 | |
|                   const char *descr = NULL)
 | |
|       : Measurement<TimeGauge, Callable>(callable, name, descr) {}
 | |
| 
 | |
|   template <typename Callable_Rhs>
 | |
|   TimeMeasurement(const TimeMeasurement<Callable_Rhs> &rhs)
 | |
|       : Measurement<TimeGauge, Callable>(rhs) {}
 | |
| 
 | |
|   template <typename GaugeType_Rhs, typename Callable_Rhs>
 | |
|   TimeMeasurement(const Measurement<GaugeType_Rhs, Callable_Rhs> &rhs)
 | |
|       : Measurement<GaugeType_Rhs, Callable_Rhs>(rhs) {}
 | |
| 
 | |
|   template <typename... Args> void operator()(Args... args) {
 | |
|     Measurement<TimeGauge, Callable>::operator()(args...);
 | |
|   }
 | |
| };
 | |
| 
 | |
| template <typename Callable>
 | |
| class MemoryMeasurement : public Measurement<MemoryGauge, Callable> {
 | |
| public:
 | |
|   MemoryMeasurement() : Measurement<MemoryGauge, Callable>() {}
 | |
| 
 | |
|   MemoryMeasurement(Callable callable, const char *name, const char *descr)
 | |
|       : Measurement<MemoryGauge, Callable>(callable, name, descr) {}
 | |
| 
 | |
|   MemoryMeasurement(const char *name, const char *descr)
 | |
|       : Measurement<MemoryGauge, Callable>(name, descr) {}
 | |
| 
 | |
|   template <typename Callable_Rhs>
 | |
|   MemoryMeasurement(const MemoryMeasurement<Callable_Rhs> &rhs)
 | |
|       : Measurement<MemoryGauge, Callable>(rhs) {}
 | |
| 
 | |
|   template <typename GaugeType_Rhs, typename Callable_Rhs>
 | |
|   MemoryMeasurement(const Measurement<GaugeType_Rhs, Callable_Rhs> &rhs)
 | |
|       : Measurement<GaugeType_Rhs, Callable_Rhs>(rhs) {}
 | |
| 
 | |
|   template <typename... Args> void operator()(Args... args) {
 | |
|     Measurement<MemoryGauge, Callable>::operator()(args...);
 | |
|   }
 | |
| };
 | |
| }
 | |
| 
 | |
| #endif /* defined(__PerfTestDriver__Measurement__) */
 |