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