1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
//
// Metric.cpp
// PerfTestDriver
//
// Created by Enrico Granata on 3/7/13.
// Copyright (c) 2013 Apple Inc. All rights reserved.
//
#include "Metric.h"
#include "CFCMutableArray.h"
#include "CFCMutableDictionary.h"
#include "CFCString.h"
#include "MemoryGauge.h"
using namespace lldb_perf;
template <class T>
Metric<T>::Metric () : Metric ("")
{}
template <class T>
Metric<T>::Metric (const char* n, const char* d) :
m_name(n ? n : ""),
m_description(d ? d : ""),
m_dataset ()
{}
template <class T>
void
Metric<T>::append (T v)
{
m_dataset.push_back(v);
}
template <class T>
size_t
Metric<T>::count ()
{
return m_dataset.size();
}
template <class T>
T
Metric<T>::sum ()
{
T sum = 0;
for (auto v : m_dataset)
sum += v;
return sum;
}
template <class T>
T
Metric<T>::average ()
{
return sum()/count();
}
template <class T>
const char*
Metric<T>::name ()
{
return m_name.c_str();
}
template <class T>
const char*
Metric<T>::description ()
{
return m_description.c_str();
}
template <>
void Metric<double>::WriteImpl (CFCMutableArray& parent, identity<double>)
{
CFCMutableDictionary dict;
dict.AddValueCString(CFCString("name").get(),name(), true);
dict.AddValueCString(CFCString("description").get(),description(), true);
dict.AddValueDouble(CFCString("value").get(),this->average(), true);
parent.AppendValue(dict.get(), true);
}
template <>
void Metric<MemoryStats>::WriteImpl (CFCMutableArray& parent, identity<MemoryStats>)
{
CFCMutableDictionary dict;
dict.AddValueCString(CFCString("name").get(),name(), true);
dict.AddValueCString(CFCString("description").get(),description(), true);
CFCMutableDictionary value;
auto avg = this->average();
value.AddValueUInt64(CFCString("virtual").get(), avg.GetVirtualSize(), true);
value.AddValueUInt64(CFCString("resident").get(), avg.GetResidentSize(), true);
value.AddValueUInt64(CFCString("max_resident").get(), avg.GetMaxResidentSize(), true);
dict.AddValue(CFCString("value").get(),value.get(), true);
parent.AppendValue(dict.get(), true);
}
template class lldb_perf::Metric<double>;
template class lldb_perf::Metric<MemoryStats>;
|