diff options
Diffstat (limited to 'lldb/tools/lldb-perf/lib')
| -rw-r--r-- | lldb/tools/lldb-perf/lib/Measurement.h | 11 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/lib/Metric.cpp | 27 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/lib/Metric.h | 8 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/lib/Results.cpp | 15 | ||||
| -rw-r--r-- | lldb/tools/lldb-perf/lib/Results.h | 10 |
5 files changed, 52 insertions, 19 deletions
diff --git a/lldb/tools/lldb-perf/lib/Measurement.h b/lldb/tools/lldb-perf/lib/Measurement.h index d43a37962f3..877e618d546 100644 --- a/lldb/tools/lldb-perf/lib/Measurement.h +++ b/lldb/tools/lldb-perf/lib/Measurement.h @@ -113,6 +113,17 @@ public: } void + WriteAverageAndStandardDeviation (Results &results) + { + auto metric = GetMetric (); + auto dictionary = (Results::Dictionary*)results.GetDictionary().Add(metric.GetName(), metric.GetDescription(), lldb_perf::GetResult<typename GaugeType::ValueType> (NULL, metric.GetAverage())).get(); + if (dictionary) + { + dictionary->Add("stddev", NULL, lldb_perf::GetResult<typename GaugeType::ValueType> (NULL, metric.GetStandardDeviation())); + } + } + + void WriteStandardDeviation (Results &results) { auto metric = GetMetric (); 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>; diff --git a/lldb/tools/lldb-perf/lib/Metric.h b/lldb/tools/lldb-perf/lib/Metric.h index 8c32019b21f..45342d25b41 100644 --- a/lldb/tools/lldb-perf/lib/Metric.h +++ b/lldb/tools/lldb-perf/lib/Metric.h @@ -22,6 +22,12 @@ template <class ValueType> class Metric { public: + enum class StandardDeviationMode + { + eSample, + ePopulation + }; + Metric (); Metric (const char*, const char* = NULL); @@ -38,7 +44,7 @@ public: GetSum () const; ValueType - GetStandardDeviation () const; + GetStandardDeviation (StandardDeviationMode mode = StandardDeviationMode::ePopulation) const; const char* GetName () const diff --git a/lldb/tools/lldb-perf/lib/Results.cpp b/lldb/tools/lldb-perf/lib/Results.cpp index 2bf74359826..6abf67e53b6 100644 --- a/lldb/tools/lldb-perf/lib/Results.cpp +++ b/lldb/tools/lldb-perf/lib/Results.cpp @@ -176,7 +176,7 @@ Results::Write (const char *out_path) #endif } -void +Results::ResultSP Results::Dictionary::AddUnsigned (const char *name, const char *description, uint64_t value) { assert (name && name[0]); @@ -189,9 +189,10 @@ Results::Dictionary::AddUnsigned (const char *name, const char *description, uin } else m_dictionary[std::string(name)] = ResultSP (new Unsigned (name, description, value)); + return m_dictionary[std::string(name)]; } -void +Results::ResultSP Results::Dictionary::AddDouble (const char *name, const char *description, double value) { assert (name && name[0]); @@ -205,8 +206,9 @@ Results::Dictionary::AddDouble (const char *name, const char *description, doubl } else m_dictionary[std::string(name)] = ResultSP (new Double (name, description, value)); + return m_dictionary[std::string(name)]; } -void +Results::ResultSP Results::Dictionary::AddString (const char *name, const char *description, const char *value) { assert (name && name[0]); @@ -219,9 +221,10 @@ Results::Dictionary::AddString (const char *name, const char *description, const } else m_dictionary[std::string(name)] = ResultSP (new String (name, description, value)); + return m_dictionary[std::string(name)]; } -void +Results::ResultSP Results::Dictionary::Add (const char *name, const char *description, const ResultSP &result_sp) { assert (name && name[0]); @@ -234,6 +237,7 @@ Results::Dictionary::Add (const char *name, const char *description, const Resul } else m_dictionary[std::string(name)] = result_sp; + return m_dictionary[std::string(name)]; } void @@ -249,10 +253,11 @@ Results::Dictionary::ForEach (const std::function <bool (const std::string &, co -void +Results::ResultSP Results::Array::Append (const ResultSP &result_sp) { m_array.push_back (result_sp); + return result_sp; } void diff --git a/lldb/tools/lldb-perf/lib/Results.h b/lldb/tools/lldb-perf/lib/Results.h index f15b902f911..0602138f6f0 100644 --- a/lldb/tools/lldb-perf/lib/Results.h +++ b/lldb/tools/lldb-perf/lib/Results.h @@ -138,7 +138,7 @@ public: { } - void + ResultSP Append (const ResultSP &result_sp); void @@ -179,16 +179,16 @@ public: void ForEach (const std::function <bool (const std::string &, const ResultSP &)> &callback); - void + ResultSP Add (const char *name, const char *description, const ResultSP &result_sp); - void + ResultSP AddDouble (const char *name, const char *descriptiorn, double value); - void + ResultSP AddUnsigned (const char *name, const char *description, uint64_t value); - void + ResultSP AddString (const char *name, const char *description, const char *value); protected: |

