summaryrefslogtreecommitdiff
path: root/tools/lldb-perf/lib/Metric.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lldb-perf/lib/Metric.cpp')
-rw-r--r--tools/lldb-perf/lib/Metric.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/tools/lldb-perf/lib/Metric.cpp b/tools/lldb-perf/lib/Metric.cpp
new file mode 100644
index 0000000000000..1951cdb0250ae
--- /dev/null
+++ b/tools/lldb-perf/lib/Metric.cpp
@@ -0,0 +1,85 @@
+//===-- 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>;