# 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()