//===-- 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 "Timer.h" #include "Metric.h" #include "MemoryGauge.h" namespace lldb_perf { template 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(name, desc)) { } Measurement (const char* name, const char* desc) : m_gauge (), m_callable (), m_metric (Metric(name, desc)) { } template Measurement (const Measurement& rhs) : m_gauge(rhs.GetGauge()), m_callable(rhs.GetCallable()), m_metric(rhs.GetMetric()) { } template 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& 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 (NULL, metric.GetStartValue())); } void WriteStopValue (Results &results) { auto metric = GetMetric (); results.GetDictionary().Add(metric.GetName(), metric.GetDescription(), lldb_perf::GetResult (NULL, metric.GetStopValue())); } void WriteAverageValue (Results &results) { auto metric = GetMetric (); results.GetDictionary().Add(metric.GetName(), metric.GetDescription(), lldb_perf::GetResult (NULL, metric.GetAverage())); } void WriteAverageAndStandardDeviation (Results &results) { auto metric = GetMetric (); auto dictionary = (Results::Dictionary*)results.GetDictionary().Add(metric.GetName(), metric.GetDescription(), lldb_perf::GetResult (NULL, metric.GetAverage())).get(); if (dictionary) { dictionary->Add("stddev", NULL, lldb_perf::GetResult (NULL, metric.GetStandardDeviation())); } } void WriteStandardDeviation (Results &results) { auto metric = GetMetric (); results.GetDictionary().Add(metric.GetName(), metric.GetDescription(), lldb_perf::GetResult (NULL, metric.GetStandardDeviation())); } protected: GaugeType m_gauge; Callable m_callable; Metric m_metric; }; template class TimeMeasurement : public Measurement { public: TimeMeasurement () : Measurement () { } TimeMeasurement (Callable callable, const char* name = NULL, const char* descr = NULL) : Measurement (callable, name, descr) { } template TimeMeasurement (const TimeMeasurement& rhs) : Measurement(rhs) { } template TimeMeasurement (const Measurement& rhs) : Measurement(rhs) { } template void operator () (Args... args) { Measurement::operator()(args...); } }; template class MemoryMeasurement : public Measurement { public: MemoryMeasurement () : Measurement () { } MemoryMeasurement (Callable callable, const char* name, const char* descr) : Measurement (callable, name, descr) { } MemoryMeasurement (const char* name, const char* descr) : Measurement (name, descr) { } template MemoryMeasurement (const MemoryMeasurement& rhs) : Measurement(rhs) { } template MemoryMeasurement (const Measurement& rhs) : Measurement(rhs) { } template void operator () (Args... args) { Measurement::operator()(args...); } }; } #endif /* defined(__PerfTestDriver__Measurement__) */