summaryrefslogtreecommitdiffstats
path: root/lldb/tools/lldb-perf/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/tools/lldb-perf/lib')
-rw-r--r--lldb/tools/lldb-perf/lib/Measurement.h11
-rw-r--r--lldb/tools/lldb-perf/lib/Metric.cpp27
-rw-r--r--lldb/tools/lldb-perf/lib/Metric.h8
-rw-r--r--lldb/tools/lldb-perf/lib/Results.cpp15
-rw-r--r--lldb/tools/lldb-perf/lib/Results.h10
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:
OpenPOWER on IntegriCloud