Metric.cpp revision 53bba61c0b9f3b3ceff5835f79d61efa0d81847c
1//
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"
14#include "MemoryGauge.h"
15
16using namespace lldb_perf;
17
18template <class T>
19Metric<T>::Metric () : Metric ("")
20{}
21
22template <class T>
23Metric<T>::Metric (const char* n, const char* d) :
24m_name(n ? n : ""),
25m_description(d ? d : ""),
26m_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>
68const char*
69Metric<T>::description ()
70{
71    return m_description.c_str();
72}
73
74template <>
75void Metric<double>::WriteImpl (CFCMutableArray& parent, identity<double>)
76{
77    CFCMutableDictionary dict;
78    dict.AddValueCString(CFCString("name").get(),name(), true);
79    dict.AddValueCString(CFCString("description").get(),description(), true);
80    dict.AddValueDouble(CFCString("value").get(),this->average(), true);
81    parent.AppendValue(dict.get(), true);
82}
83
84template <>
85void Metric<MemoryStats>::WriteImpl (CFCMutableArray& parent, identity<MemoryStats>)
86{
87    CFCMutableDictionary dict;
88    dict.AddValueCString(CFCString("name").get(),name(), true);
89    dict.AddValueCString(CFCString("description").get(),description(), true);
90    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
100    parent.AppendValue(dict.get(), true);
101}
102
103template class lldb_perf::Metric<double>;
104template class lldb_perf::Metric<MemoryStats>;
105