diff options
Diffstat (limited to 'lldb/tools/lldb-perf/lib/Metric.cpp')
| -rw-r--r-- | lldb/tools/lldb-perf/lib/Metric.cpp | 27 |
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>; |

