diff options
Diffstat (limited to 'packages/Python/lldbsuite/test/lldbbench.py')
| -rw-r--r-- | packages/Python/lldbsuite/test/lldbbench.py | 118 | 
1 files changed, 118 insertions, 0 deletions
| diff --git a/packages/Python/lldbsuite/test/lldbbench.py b/packages/Python/lldbsuite/test/lldbbench.py new file mode 100644 index 0000000000000..6b568f874661d --- /dev/null +++ b/packages/Python/lldbsuite/test/lldbbench.py @@ -0,0 +1,118 @@ +from __future__ import absolute_import + +# System modules +import time + +# Third-party modules + +# LLDB modules +from .lldbtest import * + +class Stopwatch(object): +    """Stopwatch provides a simple utility to start/stop your stopwatch multiple +    times.  Each start/stop is equal to a lap, with its elapsed time accumulated +    while measurment is in progress. + +    When you're ready to start from scratch for another round of measurements, +    be sure to call the reset() method. + +    For example, + +    sw = Stopwatch() +    for i in range(1000): +        with sw: +            # Do some length operations... +            ... +    # Get the average time. +    avg_time = sw.avg() + +    # Reset the stopwatch as we are about to perform other kind of operations. +    sw.reset() +    ... +    """ + +    ############################################################# +    # +    # Context manager interfaces to support the 'with' statement. +    # +    ############################################################# + +    def __enter__(self): +        """ +        Context management protocol on entry to the body of the with statement. +        """ +        return self.start() + +    def __exit__(self, type, value, tb): +        """ +        Context management protocol on exit from the body of the with statement. +        """ +        self.stop() + +    def reset(self): +        self.__laps__ = 0 +        self.__total_elapsed__ = 0.0 +        self.__start__ = None +        self.__stop__ = None +        self.__elapsed__ = 0.0 +        self.__nums__ = [] + +    def __init__(self): +        self.reset() + +    def start(self): +        if self.__start__ is None: +            self.__start__ = time.time() +        else: +            raise Exception("start() already called, did you forget to stop() first?") +        # Return self to facilitate the context manager __enter__ protocol. +        return self + +    def stop(self): +        if self.__start__ is not None: +            self.__stop__ = time.time() +            elapsed = self.__stop__ - self.__start__ +            self.__total_elapsed__ += elapsed +            self.__laps__ += 1 +            self.__nums__.append(elapsed) +            self.__start__ = None # Reset __start__ to be None again. +        else: +            raise Exception("stop() called without first start()?") + +    def laps(self): +        """Gets the number of laps. One lap is equal to a start/stop action.""" +        return self.__laps__ + +    def avg(self): +        """Equal to total elapsed time divided by the number of laps.""" +        return self.__total_elapsed__ / self.__laps__ + +    #def sigma(self): +    #    """Return the standard deviation of the available samples.""" +    #    if self.__laps__ <= 0: +    #        return None +    #    return numpy.std(self.__nums__) + +    def __str__(self): +        return "Avg: %f (Laps: %d, Total Elapsed Time: %f, min=%f, max=%f)" % (self.avg(), +                                                                               self.__laps__, +                                                                               self.__total_elapsed__, +                                                                               min(self.__nums__), +                                                                               max(self.__nums__)) + +class BenchBase(TestBase): +    """ +    Abstract base class for benchmark tests. +    """ +    def setUp(self): +        """Fixture for unittest test case setup.""" +        super(BenchBase, self).setUp() +        #TestBase.setUp(self) +        self.stopwatch = Stopwatch() + +    def tearDown(self): +        """Fixture for unittest test case teardown.""" +        super(BenchBase, self).tearDown() +        #TestBase.tearDown(self) +        del self.stopwatch + | 
