| //===-- Metric.cpp ----------------------------------------------*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "Metric.h" | |
| #include "MemoryGauge.h" | |
| #include <cmath> | |
| using namespace lldb_perf; | |
| template <class T> Metric<T>::Metric() : Metric("") {} | |
| template <class T> | |
| Metric<T>::Metric(const char *n, const char *d) | |
| : m_name(n ? n : ""), m_description(d ? d : ""), m_dataset() {} | |
| template <class T> void Metric<T>::Append(T v) { m_dataset.push_back(v); } | |
| template <class T> size_t Metric<T>::GetCount() const { | |
| return m_dataset.size(); | |
| } | |
| template <class T> T Metric<T>::GetSum() const { | |
| T sum = 0; | |
| for (auto v : m_dataset) | |
| sum += v; | |
| return sum; | |
| } | |
| template <class T> T Metric<T>::GetAverage() const { | |
| return GetSum() / GetCount(); | |
| } | |
| // Knuth's algorithm for stddev - massive cancellation resistant | |
| template <class T> | |
| T Metric<T>::GetStandardDeviation(StandardDeviationMode mode) const { | |
| size_t n = 0; | |
| T mean = 0; | |
| T M2 = 0; | |
| for (auto x : m_dataset) { | |
| n = n + 1; | |
| T delta = x - mean; | |
| mean = mean + delta / n; | |
| M2 = M2 + delta * (x - mean); | |
| } | |
| T variance; | |
| if (mode == StandardDeviationMode::ePopulation || n == 1) | |
| variance = M2 / n; | |
| else | |
| variance = M2 / (n - 1); | |
| return sqrt(variance); | |
| } | |
| template class lldb_perf::Metric<double>; | |
| template class lldb_perf::Metric<MemoryStats>; |