//===-- 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 using namespace lldb_perf; template Metric::Metric() : Metric("") {} template Metric::Metric(const char *n, const char *d) : m_name(n ? n : ""), m_description(d ? d : ""), m_dataset() {} template void Metric::Append(T v) { m_dataset.push_back(v); } template size_t Metric::GetCount() const { return m_dataset.size(); } template T Metric::GetSum() const { T sum = 0; for (auto v : m_dataset) sum += v; return sum; } template T Metric::GetAverage() const { return GetSum() / GetCount(); } // Knuth's algorithm for stddev - massive cancellation resistant template T Metric::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; template class lldb_perf::Metric;