blob: bf8120f2b890fb359db9b9e5050a3c2454ed515d [file] [log] [blame]
Greg Clayton5dbe5d42013-03-21 03:39:51 +00001//===-- Metric.cpp ----------------------------------------------*- C++ -*-===//
Enrico Granataf58cece2013-03-08 20:29:13 +00002//
Greg Clayton5dbe5d42013-03-21 03:39:51 +00003// The LLVM Compiler Infrastructure
Enrico Granataf58cece2013-03-08 20:29:13 +00004//
Greg Clayton5dbe5d42013-03-21 03:39:51 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Enrico Granataf58cece2013-03-08 20:29:13 +00007//
Greg Clayton5dbe5d42013-03-21 03:39:51 +00008//===----------------------------------------------------------------------===//
Enrico Granataf58cece2013-03-08 20:29:13 +00009
10#include "Metric.h"
11
12#include "CFCMutableArray.h"
13#include "CFCMutableDictionary.h"
14#include "CFCString.h"
Enrico Granataf3fb83a2013-03-20 21:18:20 +000015#include "MemoryGauge.h"
Enrico Granataf58cece2013-03-08 20:29:13 +000016
Greg Clayton7b8f7382013-03-18 22:34:00 +000017using namespace lldb_perf;
Enrico Granataf58cece2013-03-08 20:29:13 +000018
19template <class T>
20Metric<T>::Metric () : Metric ("")
Greg Clayton880afc52013-03-22 02:31:35 +000021{
22}
Enrico Granataf58cece2013-03-08 20:29:13 +000023
24template <class T>
Enrico Granata86910572013-03-14 19:00:42 +000025Metric<T>::Metric (const char* n, const char* d) :
Greg Clayton880afc52013-03-22 02:31:35 +000026 m_name(n ? n : ""),
27 m_description(d ? d : ""),
28 m_dataset ()
29{
30}
Enrico Granataf58cece2013-03-08 20:29:13 +000031
32template <class T>
33void
Greg Claytonef0d2142013-03-21 03:32:24 +000034Metric<T>::Append (T v)
Enrico Granataf58cece2013-03-08 20:29:13 +000035{
36 m_dataset.push_back(v);
37}
38
39template <class T>
40size_t
Greg Claytonef0d2142013-03-21 03:32:24 +000041Metric<T>::GetCount () const
Enrico Granataf58cece2013-03-08 20:29:13 +000042{
43 return m_dataset.size();
44}
45
46template <class T>
47T
Greg Claytonef0d2142013-03-21 03:32:24 +000048Metric<T>::GetSum () const
Enrico Granataf58cece2013-03-08 20:29:13 +000049{
50 T sum = 0;
51 for (auto v : m_dataset)
52 sum += v;
53 return sum;
54}
55
56template <class T>
57T
Greg Claytonef0d2142013-03-21 03:32:24 +000058Metric<T>::GetAverage () const
Enrico Granataf58cece2013-03-08 20:29:13 +000059{
Greg Claytonef0d2142013-03-21 03:32:24 +000060 return GetSum()/GetCount();
Enrico Granata86910572013-03-14 19:00:42 +000061}
62
Enrico Granataf3fb83a2013-03-20 21:18:20 +000063template <>
Greg Clayton880afc52013-03-22 02:31:35 +000064void Metric<double>::WriteImpl (CFCMutableDictionary& parent_dict, const char *name, const char *description, double value)
Enrico Granataf58cece2013-03-08 20:29:13 +000065{
Greg Clayton880afc52013-03-22 02:31:35 +000066 assert(name && name[0]);
Enrico Granataf58cece2013-03-08 20:29:13 +000067 CFCMutableDictionary dict;
Greg Clayton880afc52013-03-22 02:31:35 +000068 if (description && description[0])
69 dict.AddValueCString(CFCString("description").get(),description, true);
70 dict.AddValueDouble(CFCString("value").get(),value, true);
71 parent_dict.AddValue(CFCString(name).get(), dict.get(), true);
Enrico Granataf58cece2013-03-08 20:29:13 +000072}
73
Enrico Granataf3fb83a2013-03-20 21:18:20 +000074template <>
Greg Clayton880afc52013-03-22 02:31:35 +000075void Metric<MemoryStats>::WriteImpl (CFCMutableDictionary& parent_dict, const char *name, const char *description, MemoryStats value)
Enrico Granataf58cece2013-03-08 20:29:13 +000076{
77 CFCMutableDictionary dict;
Greg Clayton880afc52013-03-22 02:31:35 +000078 if (description && description[0])
79 dict.AddValueCString(CFCString("description").get(),description, true);
80 CFCMutableDictionary value_dict;
81 // don't write out the "virtual size", it doesn't mean anything useful as it includes
82 // all of the shared cache and many other things that make it way too big to be useful
83 //value_dict.AddValueUInt64(CFCString("virtual").get(), value.GetVirtualSize(), true);
84 value_dict.AddValueUInt64(CFCString("resident").get(), value.GetResidentSize(), true);
85 value_dict.AddValueUInt64(CFCString("max_resident").get(), value.GetMaxResidentSize(), true);
86
87 dict.AddValue(CFCString("value").get(),value_dict.get(), true);
Enrico Granataf3fb83a2013-03-20 21:18:20 +000088
Greg Clayton880afc52013-03-22 02:31:35 +000089 parent_dict.AddValue(CFCString(name).get(), dict.get(), true);
Enrico Granataf58cece2013-03-08 20:29:13 +000090}
91
Greg Clayton7b8f7382013-03-18 22:34:00 +000092template class lldb_perf::Metric<double>;
Enrico Granataf3fb83a2013-03-20 21:18:20 +000093template class lldb_perf::Metric<MemoryStats>;