xref: /llvm-project/lldb/examples/summaries/cocoa/metrics.py (revision b9c1b51e45b845debb76d8658edabca70ca56079)
1"""
2Objective-C runtime wrapper for use by LLDB Python formatters
3
4part of The LLVM Compiler Infrastructure
5This file is distributed under the University of Illinois Open Source
6License. See LICENSE.TXT for details.
7"""
8import lldb
9import time
10import datetime
11import inspect
12
13
14class TimeMetrics:
15
16    @staticmethod
17    def generate(label=None):
18        return TimeMetrics(label)
19
20    def __init__(self, lbl=None):
21        self.label = "" if lbl is None else lbl
22        pass
23
24    def __enter__(self):
25        caller = inspect.stack()[1]
26        self.function = str(caller)
27        self.enter_time = time.clock()
28
29    def __exit__(self, a, b, c):
30        self.exit_time = time.clock()
31        print("It took " + str(self.exit_time - self.enter_time) +
32              " time units to run through " + self.function + self.label)
33        return False
34
35
36class Counter:
37
38    def __init__(self):
39        self.count = 0
40        self.list = []
41
42    def update(self, name):
43        self.count = self.count + 1
44        # avoid getting the full dump of this ValueObject just to save its
45        # metrics
46        if isinstance(name, lldb.SBValue):
47            self.list.append(name.GetName())
48        else:
49            self.list.append(str(name))
50
51    def __str__(self):
52        return str(self.count) + " times, for items [" + str(self.list) + "]"
53
54
55class MetricsPrinter_Verbose:
56
57    def __init__(self, metrics):
58        self.metrics = metrics
59
60    def __str__(self):
61        string = ""
62        for key, value in self.metrics.metrics.items():
63            string = string + "metric " + str(key) + ": " + str(value) + "\n"
64        return string
65
66
67class MetricsPrinter_Compact:
68
69    def __init__(self, metrics):
70        self.metrics = metrics
71
72    def __str__(self):
73        string = ""
74        for key, value in self.metrics.metrics.items():
75            string = string + "metric " + \
76                str(key) + " was hit " + str(value.count) + " times\n"
77        return string
78
79
80class Metrics:
81
82    def __init__(self):
83        self.metrics = {}
84
85    def add_metric(self, name):
86        self.metrics[name] = Counter()
87
88    def metric_hit(self, metric, trigger):
89        self.metrics[metric].update(trigger)
90
91    def __getitem__(self, key):
92        return self.metrics[key]
93
94    def __getattr__(self, name):
95        if name == 'compact':
96            return MetricsPrinter_Compact(self)
97        if name == 'verbose':
98            return MetricsPrinter_Verbose(self)
99        raise AttributeError("%r object has no attribute %r" %
100                             (type(self).__name__, name))
101
102    def __str__(self):
103        return str(self.verbose)
104
105    def metric_success(self, metric):
106        total_count = 0
107        metric_count = self[metric].count
108        for key, value in self.metrics.items():
109            total_count = total_count + value.count
110        if total_count > 0:
111            return metric_count / float(total_count)
112        return 0
113