Greg Clayton | 5dbe5d4 | 2013-03-21 03:39:51 +0000 | [diff] [blame] | 1 | //===-- Metric.cpp ----------------------------------------------*- C++ -*-===// |
Enrico Granata | f58cece | 2013-03-08 20:29:13 +0000 | [diff] [blame] | 2 | // |
Greg Clayton | 5dbe5d4 | 2013-03-21 03:39:51 +0000 | [diff] [blame] | 3 | // The LLVM Compiler Infrastructure |
Enrico Granata | f58cece | 2013-03-08 20:29:13 +0000 | [diff] [blame] | 4 | // |
Greg Clayton | 5dbe5d4 | 2013-03-21 03:39:51 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
Enrico Granata | f58cece | 2013-03-08 20:29:13 +0000 | [diff] [blame] | 7 | // |
Greg Clayton | 5dbe5d4 | 2013-03-21 03:39:51 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// |
Enrico Granata | f58cece | 2013-03-08 20:29:13 +0000 | [diff] [blame] | 9 | |
| 10 | #include "Metric.h" |
Enrico Granata | f3fb83a | 2013-03-20 21:18:20 +0000 | [diff] [blame] | 11 | #include "MemoryGauge.h" |
Enrico Granata | 1ed58f7 | 2013-04-02 21:59:39 +0000 | [diff] [blame] | 12 | #include <cmath> |
Enrico Granata | f58cece | 2013-03-08 20:29:13 +0000 | [diff] [blame] | 13 | |
Greg Clayton | 7b8f738 | 2013-03-18 22:34:00 +0000 | [diff] [blame] | 14 | using namespace lldb_perf; |
Enrico Granata | f58cece | 2013-03-08 20:29:13 +0000 | [diff] [blame] | 15 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 16 | template <class T> Metric<T>::Metric() : Metric("") {} |
Enrico Granata | f58cece | 2013-03-08 20:29:13 +0000 | [diff] [blame] | 17 | |
| 18 | template <class T> |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 19 | Metric<T>::Metric(const char *n, const char *d) |
| 20 | : m_name(n ? n : ""), m_description(d ? d : ""), m_dataset() {} |
| 21 | |
| 22 | template <class T> void Metric<T>::Append(T v) { m_dataset.push_back(v); } |
| 23 | |
| 24 | template <class T> size_t Metric<T>::GetCount() const { |
| 25 | return m_dataset.size(); |
Greg Clayton | 880afc5 | 2013-03-22 02:31:35 +0000 | [diff] [blame] | 26 | } |
Enrico Granata | f58cece | 2013-03-08 20:29:13 +0000 | [diff] [blame] | 27 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 28 | template <class T> T Metric<T>::GetSum() const { |
| 29 | T sum = 0; |
| 30 | for (auto v : m_dataset) |
| 31 | sum += v; |
| 32 | return sum; |
Enrico Granata | f58cece | 2013-03-08 20:29:13 +0000 | [diff] [blame] | 33 | } |
| 34 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 35 | template <class T> T Metric<T>::GetAverage() const { |
| 36 | return GetSum() / GetCount(); |
Enrico Granata | f58cece | 2013-03-08 20:29:13 +0000 | [diff] [blame] | 37 | } |
| 38 | |
Enrico Granata | b349efe | 2013-04-15 19:57:32 +0000 | [diff] [blame] | 39 | // Knuth's algorithm for stddev - massive cancellation resistant |
Enrico Granata | 1ed58f7 | 2013-04-02 21:59:39 +0000 | [diff] [blame] | 40 | template <class T> |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 41 | T Metric<T>::GetStandardDeviation(StandardDeviationMode mode) const { |
| 42 | size_t n = 0; |
| 43 | T mean = 0; |
| 44 | T M2 = 0; |
| 45 | for (auto x : m_dataset) { |
| 46 | n = n + 1; |
| 47 | T delta = x - mean; |
| 48 | mean = mean + delta / n; |
| 49 | M2 = M2 + delta * (x - mean); |
| 50 | } |
| 51 | T variance; |
| 52 | if (mode == StandardDeviationMode::ePopulation || n == 1) |
| 53 | variance = M2 / n; |
| 54 | else |
| 55 | variance = M2 / (n - 1); |
| 56 | return sqrt(variance); |
Enrico Granata | 1ed58f7 | 2013-04-02 21:59:39 +0000 | [diff] [blame] | 57 | } |
| 58 | |
Greg Clayton | 7b8f738 | 2013-03-18 22:34:00 +0000 | [diff] [blame] | 59 | template class lldb_perf::Metric<double>; |
Enrico Granata | f3fb83a | 2013-03-20 21:18:20 +0000 | [diff] [blame] | 60 | template class lldb_perf::Metric<MemoryStats>; |