summaryrefslogtreecommitdiffstats
path: root/packages/Python/lldbsuite/test/lldbbench.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/Python/lldbsuite/test/lldbbench.py')
-rw-r--r--packages/Python/lldbsuite/test/lldbbench.py118
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 0000000..6b568f8
--- /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
+
OpenPOWER on IntegriCloud