Enrico Granata | 3f1052b | 2012-03-13 21:52:00 +0000 | [diff] [blame] | 1 | """ |
| 2 | Objective-C runtime wrapper for use by LLDB Python formatters |
| 3 | |
| 4 | part of The LLVM Compiler Infrastructure |
| 5 | This file is distributed under the University of Illinois Open Source |
| 6 | License. See LICENSE.TXT for details. |
| 7 | """ |
Enrico Granata | eb4a479 | 2012-02-23 23:10:27 +0000 | [diff] [blame] | 8 | import lldb |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 9 | import time |
| 10 | import datetime |
Enrico Granata | 263ebe5 | 2012-05-18 19:55:37 +0000 | [diff] [blame] | 11 | import inspect |
| 12 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 13 | |
Enrico Granata | 263ebe5 | 2012-05-18 19:55:37 +0000 | [diff] [blame] | 14 | class TimeMetrics: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 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 | |
Enrico Granata | eb4a479 | 2012-02-23 23:10:27 +0000 | [diff] [blame] | 35 | |
| 36 | class Counter: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 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 | |
Enrico Granata | eb4a479 | 2012-02-23 23:10:27 +0000 | [diff] [blame] | 54 | |
| 55 | class MetricsPrinter_Verbose: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 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 | |
Enrico Granata | eb4a479 | 2012-02-23 23:10:27 +0000 | [diff] [blame] | 66 | |
| 67 | class MetricsPrinter_Compact: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 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 | |
Enrico Granata | eb4a479 | 2012-02-23 23:10:27 +0000 | [diff] [blame] | 79 | |
| 80 | class Metrics: |
Enrico Granata | eb4a479 | 2012-02-23 23:10:27 +0000 | [diff] [blame] | 81 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 82 | def __init__(self): |
| 83 | self.metrics = {} |
Enrico Granata | eb4a479 | 2012-02-23 23:10:27 +0000 | [diff] [blame] | 84 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 85 | def add_metric(self, name): |
| 86 | self.metrics[name] = Counter() |
Enrico Granata | eb4a479 | 2012-02-23 23:10:27 +0000 | [diff] [blame] | 87 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 88 | def metric_hit(self, metric, trigger): |
| 89 | self.metrics[metric].update(trigger) |
Enrico Granata | eb4a479 | 2012-02-23 23:10:27 +0000 | [diff] [blame] | 90 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 91 | def __getitem__(self, key): |
| 92 | return self.metrics[key] |
Enrico Granata | eb4a479 | 2012-02-23 23:10:27 +0000 | [diff] [blame] | 93 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 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)) |
Enrico Granata | eb4a479 | 2012-02-23 23:10:27 +0000 | [diff] [blame] | 101 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame^] | 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 |