| # Copyright 2013 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import time |
| |
| |
| class Timer(object): |
| '''A simple timer which starts when constructed and stops when Stop is called. |
| ''' |
| |
| def __init__(self): |
| self._start = time.time() |
| self._elapsed = None |
| |
| def Stop(self): |
| '''Stops the timer. Must only be called once. Returns |self|. |
| ''' |
| assert self._elapsed is None |
| self._elapsed = time.time() - self._start |
| return self |
| |
| def With(self, other): |
| '''Returns a new stopped Timer with this Timer's elapsed time + |other|'s. |
| Both Timers must already be stopped. |
| ''' |
| assert self._elapsed is not None |
| assert other._elapsed is not None |
| self_and_other = Timer() |
| self_and_other._start = min(self._start, other._start) |
| self_and_other._elapsed = self._elapsed + other._elapsed |
| return self_and_other |
| |
| def FormatElapsed(self): |
| '''Returns the elapsed time as a string in a pretty format; as a whole |
| number in either seconds or milliseconds depending on which is more |
| appropriate. Must already be Stopped. |
| ''' |
| assert self._elapsed is not None |
| elapsed = self._elapsed |
| if elapsed < 1: |
| elapsed = int(elapsed * 1000) |
| unit = 'ms' |
| else: |
| elapsed = int(elapsed) |
| unit = 'second' if elapsed == 1 else 'seconds' |
| return '%s %s' % (elapsed, unit) |
| |
| |
| def TimerClosure(closure, *args, **optargs): |
| '''A shorthand for timing a single function call. Returns a tuple of |
| (closure return value, timer). |
| ''' |
| timer = Timer() |
| try: |
| return closure(*args, **optargs), timer |
| finally: |
| timer.Stop() |