//===-- 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 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__) */