summaryrefslogtreecommitdiffstats
path: root/lldb/tools/lldb-perf/lib/Metric.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/tools/lldb-perf/lib/Metric.cpp')
-rw-r--r--lldb/tools/lldb-perf/lib/Metric.cpp27
1 files changed, 19 insertions, 8 deletions
diff --git a/lldb/tools/lldb-perf/lib/Metric.cpp b/lldb/tools/lldb-perf/lib/Metric.cpp
index d8e7935debf..1951cdb0250 100644
--- a/lldb/tools/lldb-perf/lib/Metric.cpp
+++ b/lldb/tools/lldb-perf/lib/Metric.cpp
@@ -57,17 +57,28 @@ Metric<T>::GetAverage () const
return GetSum()/GetCount();
}
+
+// Knuth's algorithm for stddev - massive cancellation resistant
template <class T>
T
-Metric<T>::GetStandardDeviation () const
+Metric<T>::GetStandardDeviation (StandardDeviationMode mode) const
{
- T average = GetAverage();
- T diff_squared = 0;
- size_t count = GetCount();
- for (auto v : m_dataset)
- diff_squared = diff_squared + ( (v-average)*(v-average) );
- diff_squared = diff_squared / count;
- return sqrt(diff_squared);
+ 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>;
OpenPOWER on IntegriCloud