| """ |
| Objective-C runtime wrapper for use by LLDB Python formatters |
| |
| Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| See https://llvm.org/LICENSE.txt for license information. |
| SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| """ |
| import lldb |
| import time |
| import datetime |
| import inspect |
| |
| |
| class TimeMetrics: |
| |
| @staticmethod |
| def generate(label=None): |
| return TimeMetrics(label) |
| |
| def __init__(self, lbl=None): |
| self.label = "" if lbl is None else lbl |
| pass |
| |
| def __enter__(self): |
| caller = inspect.stack()[1] |
| self.function = str(caller) |
| self.enter_time = time.clock() |
| |
| def __exit__(self, a, b, c): |
| self.exit_time = time.clock() |
| print("It took " + str(self.exit_time - self.enter_time) + |
| " time units to run through " + self.function + self.label) |
| return False |
| |
| |
| class Counter: |
| |
| def __init__(self): |
| self.count = 0 |
| self.list = [] |
| |
| def update(self, name): |
| self.count = self.count + 1 |
| # avoid getting the full dump of this ValueObject just to save its |
| # metrics |
| if isinstance(name, lldb.SBValue): |
| self.list.append(name.GetName()) |
| else: |
| self.list.append(str(name)) |
| |
| def __str__(self): |
| return str(self.count) + " times, for items [" + str(self.list) + "]" |
| |
| |
| class MetricsPrinter_Verbose: |
| |
| def __init__(self, metrics): |
| self.metrics = metrics |
| |
| def __str__(self): |
| string = "" |
| for key, value in self.metrics.metrics.items(): |
| string = string + "metric " + str(key) + ": " + str(value) + "\n" |
| return string |
| |
| |
| class MetricsPrinter_Compact: |
| |
| def __init__(self, metrics): |
| self.metrics = metrics |
| |
| def __str__(self): |
| string = "" |
| for key, value in self.metrics.metrics.items(): |
| string = string + "metric " + \ |
| str(key) + " was hit " + str(value.count) + " times\n" |
| return string |
| |
| |
| class Metrics: |
| |
| def __init__(self): |
| self.metrics = {} |
| |
| def add_metric(self, name): |
| self.metrics[name] = Counter() |
| |
| def metric_hit(self, metric, trigger): |
| self.metrics[metric].update(trigger) |
| |
| def __getitem__(self, key): |
| return self.metrics[key] |
| |
| def __getattr__(self, name): |
| if name == 'compact': |
| return MetricsPrinter_Compact(self) |
| if name == 'verbose': |
| return MetricsPrinter_Verbose(self) |
| raise AttributeError("%r object has no attribute %r" % |
| (type(self).__name__, name)) |
| |
| def __str__(self): |
| return str(self.verbose) |
| |
| def metric_success(self, metric): |
| total_count = 0 |
| metric_count = self[metric].count |
| for key, value in self.metrics.items(): |
| total_count = total_count + value.count |
| if total_count > 0: |
| return metric_count / float(total_count) |
| return 0 |