blob: afacc9b11a4b936cc66fd89411522ad9711ba6c7 [file] [log] [blame]
Enrico Granataf58cece2013-03-08 20:29:13 +00001//
2// Metric.cpp
3// PerfTestDriver
4//
5// Created by Enrico Granata on 3/7/13.
6// Copyright (c) 2013 Apple Inc. All rights reserved.
7//
8
9#include "Metric.h"
10
11#include "CFCMutableArray.h"
12#include "CFCMutableDictionary.h"
13#include "CFCString.h"
Enrico Granataf3fb83a2013-03-20 21:18:20 +000014#include "MemoryGauge.h"
Enrico Granataf58cece2013-03-08 20:29:13 +000015
Greg Clayton7b8f7382013-03-18 22:34:00 +000016using namespace lldb_perf;
Enrico Granataf58cece2013-03-08 20:29:13 +000017
18template <class T>
19Metric<T>::Metric () : Metric ("")
20{}
21
22template <class T>
Enrico Granata86910572013-03-14 19:00:42 +000023Metric<T>::Metric (const char* n, const char* d) :
Enrico Granataf58cece2013-03-08 20:29:13 +000024m_name(n ? n : ""),
Enrico Granata86910572013-03-14 19:00:42 +000025m_description(d ? d : ""),
Enrico Granataf58cece2013-03-08 20:29:13 +000026m_dataset ()
27{}
28
29template <class T>
30void
31Metric<T>::append (T v)
32{
33 m_dataset.push_back(v);
34}
35
36template <class T>
37size_t
38Metric<T>::count ()
39{
40 return m_dataset.size();
41}
42
43template <class T>
44T
45Metric<T>::sum ()
46{
47 T sum = 0;
48 for (auto v : m_dataset)
49 sum += v;
50 return sum;
51}
52
53template <class T>
54T
55Metric<T>::average ()
56{
57 return sum()/count();
58}
59
60template <class T>
61const char*
62Metric<T>::name ()
63{
64 return m_name.c_str();
65}
66
67template <class T>
Enrico Granata86910572013-03-14 19:00:42 +000068const char*
69Metric<T>::description ()
70{
71 return m_description.c_str();
72}
73
Enrico Granataf3fb83a2013-03-20 21:18:20 +000074template <>
75void Metric<double>::WriteImpl (CFCMutableArray& parent, identity<double>)
Enrico Granataf58cece2013-03-08 20:29:13 +000076{
77 CFCMutableDictionary dict;
Enrico Granata86910572013-03-14 19:00:42 +000078 dict.AddValueCString(CFCString("name").get(),name(), true);
79 dict.AddValueCString(CFCString("description").get(),description(), true);
Enrico Granataf58cece2013-03-08 20:29:13 +000080 dict.AddValueDouble(CFCString("value").get(),this->average(), true);
81 parent.AppendValue(dict.get(), true);
82}
83
Enrico Granataf3fb83a2013-03-20 21:18:20 +000084template <>
85void Metric<MemoryStats>::WriteImpl (CFCMutableArray& parent, identity<MemoryStats>)
Enrico Granataf58cece2013-03-08 20:29:13 +000086{
87 CFCMutableDictionary dict;
Enrico Granata86910572013-03-14 19:00:42 +000088 dict.AddValueCString(CFCString("name").get(),name(), true);
89 dict.AddValueCString(CFCString("description").get(),description(), true);
Enrico Granataf3fb83a2013-03-20 21:18:20 +000090 CFCMutableDictionary value;
91
92 auto avg = this->average();
93
94 value.AddValueUInt64(CFCString("virtual").get(), avg.GetVirtualSize(), true);
95 value.AddValueUInt64(CFCString("resident").get(), avg.GetResidentSize(), true);
96 value.AddValueUInt64(CFCString("max_resident").get(), avg.GetMaxResidentSize(), true);
97
98 dict.AddValue(CFCString("value").get(),value.get(), true);
99
Enrico Granataf58cece2013-03-08 20:29:13 +0000100 parent.AppendValue(dict.get(), true);
101}
102
Greg Clayton7b8f7382013-03-18 22:34:00 +0000103template class lldb_perf::Metric<double>;
Enrico Granataf3fb83a2013-03-20 21:18:20 +0000104template class lldb_perf::Metric<MemoryStats>;